Jsonix - Можно ли создать коллекцию и объявить 2 или более элементов в объявлениях свойств?

Ожидаемый формат XML приведен ниже:

<c:condition>
    <a:condition>
        <fieldname>fieldName</fieldname>
        <fieldtest>fieldTest</fieldtest>
        <fieldvalues>
        <fieldvalue>fieldValue</fieldvalue>
        </fieldvalues>
    </a:condition>
    <operator>operator</operator>
    <a:condition>
    ...<some>
    </a:condition>
</c:condition>

<a:condition> и <operator> оба должны быть в collection поскольку оба могут иметь столько, сколько требуется для запроса XML.

РЕДАКТИРОВАНИЕ Type:elements код как показано ниже:

{{
    var MyModule = {
        name: 'MyModule',
        typeInfos: [{
            type: 'classInfo',
            localName: 'ElementsType',
            propertyInfos: [{
                type: 'elements',
                name: 'c:condition',
                wrapperElementName: {
                    localPart: 'condition',
                    namespaceURI: 'http://us.xomplex',
                    prefix: 'c'
                },
                collection: true,
                elementTypeInfos: [{
                    elementName: {
                        localPart: 'condition',
                        namespaceURI: 'http://us.xomplexio',
                        prefix: 'a'
                    },
                        typeInfo: 'MyModule.SubAtomic'
                    }, {
                        elementName: 'operator',
                        typeInfo: 'String'
                    }]
                }]
        },
        {
            type: 'classInfo',
            localName: 'SubAtomic',
            propertyInfos:[{
                type: 'element',
                name: 'fieldName',
                elementName: 'fieldName',
                typeInfo: 'String'
            },
            {
                type: 'element',
                name: 'fieldTest',
                elementName: 'fieldTest',
                typeInfo: 'String'
            }]
        }],
        elementInfos: [{
            elementName: 'root',
            typeInfo: 'MyModule.ElementsType'
        }]
    };
    console.log("creating unmarsaller");
    var context = new Jsonix.Context([MyModule]);
    var unmarshaller = context.createUnmarshaller();
    var unmarshalled = unmarshaller.unmarshalString('<root><c:condition xmlns:c="http://us.xomplex"><a:condition xmlns:a="http://us.xomplexio">one</a:condition><operator>2</operator><a:condition xmlns:a="http://us.xomplexio"><fieldName>unmra</fieldName><fieldTest>Beneed</fieldTest></a:condition><a:condition xmlns:a="http://us.xomplexio">four</a:condition><operator>AND</operator><operator>4</operator></c:condition></root>');
    console.log("unmarshalled");
    console.log(unmarshalled);

    var marshaller = context.createMarshaller();
    var marshalled = marshaller.marshalString({
        name: {
            localPart: 'root'
        },
    //Marshalling - not working....
        value: {
        //'c:condition': ['one', 2, 'unmra', 'four', 10,4]
            'c:condition': [
                 ['Field','Test'],9
            ]
        }
    });
    console.log(marshalled);                
}}

Редакция выглядит elements могу выполнить мои требования. Unmarshalling тоже работает. Теперь мне нужно только выяснить, как сделать это из формата Json. Любые советы будут с благодарностью

2 ответа

Решение

Это мое решение проблемы:

var MyModule = {
name: 'MyModule',
typeInfos: [{
    type: 'classInfo',
    localName: 'ElementsType',
    propertyInfos: [{
        type: 'elements',
        name: 'c:condition',
        wrapperElementName: {
            localPart: 'condition',
          namespaceURI: 'http://us.xomplex',
            prefix: 'c'
        },
        collection: true,
        elementTypeInfos: [{
            elementName: {
                localPart: 'condition',
              namespaceURI: 'http://us.xomplexio',
                    prefix: 'a'
            },
            typeInfo: 'MyModule.SubAtomic'
        }, {
            elementName: 'operator',
            typeInfo: 'String'
        }]
    }]
},
{
    type: 'classInfo',
    localName: 'SubAtomic',
    propertyInfos:[{
        type: 'element',
        name: 'fieldName',
        elementName: 'fieldName',
        typeInfo: 'String'
    },
    {
        type: 'element',
        name: 'fieldTest',
        elementName: 'fieldTest',
        typeInfo: 'String'
    },
    {
        type: 'element',
        name: 'fieldValues',
        elementName: 'fieldValues',
        typeInfo: 'MyModule.SubSubAtoms'
    }]
  },
{
    type: 'classInfo',
    localName: 'SubSubAtoms',
    propertyInfos:[
       {
            type: 'element',
            name: 'fieldValue',
            collection: true,
            elementName: 'fieldValue',
            typeInfo: 'String'
        }
     ]
 }
],
    elementInfos: [{
        elementName: 'root',
        typeInfo: 'MyModule.ElementsType',
    },
    {
        elementName: 'atoms',
        typeInfo:'MyModule.SubAtomic'
    }
   ]
};
console.log("creating unmarsaller");
var context = new Jsonix.Context([MyModule]);
var unmarshaller = context.createUnmarshaller();
var unmarshalled = unmarshaller.unmarshalString('<root><c:condition xmlns:c="http://us.xomplex"><a:condition xmlns:a="http://us.xomplexio">one</a:condition><operator>2</operator><a:condition xmlns:a="http://us.xomplexio"><fieldName>unmra</fieldName><fieldTest>Beneed</fieldTest></a:condition><a:condition xmlns:a="http://us.xomplexio">four</a:condition><operator>AND</operator><operator>4</operator></c:condition></root>');
console.log("unmarshalled");
console.log(unmarshalled);

var marshaller = context.createMarshaller();
var marshalled = marshaller.marshalString({
    name: {
        localPart: 'root'
    },
    value: {
         'c:condition': [
            "9",    
            { name:     
                {
                    localPart: 'atoms'
                },
              fieldName: "rating",
              fieldTest: "equals",
              fieldValues: {
                  fieldValue: ["563"]
              } ,
              TYPE_NAME: 'MyModule.SubAtomic'
            },
            "AND",
            { name:     
                {
                    localPart: 'atoms'
                },
              fieldName: "price",
              fieldTest: "between",
              fieldValues: {
                  fieldValue: ["150", "300"]
              } ,
              TYPE_NAME: 'MyModule.SubAtomic'
      }] //end of c:condition value
    }
});
console.log(marshalled);

Готово! Спасибо @lexicore, ваши гиды очень помогли!

Не совсем так, как вы хотите.

Ты можешь использовать elements или же elementReferences свойство объявлять свойство коллекции, которое будет содержать различные элементы в качестве элементов. Что-то вроде:

{
    type: 'elementRefs',
    name: 'acondition',
    collection: true,
    elementTypeInfos: [{
        elementName: 'condition',
        typeInfo: 'DOXML.Atomicon'
    }, {
        elementName: 'operator',
        typeInfo: 'String'
    }]
}

Это свойство будет содержать condition или же operator любое количество или заказ. Но это не гарантирует, что у вас их одинаковое количество или что оно всегда condition с последующим operator, Если это то, что вы хотите, подумайте об упаковке condition а также operator пара в такой элемент, как conditionalOperator,

Другие вопросы по тегам