Пустые свойства удаляются при маршалинге / демаршаллинге с помощью JSONIX

Я заметил, что в моем преобразовании из JSON в XML, если один из моих объектов JSON имеет значение null, объект, например, отсутствует в XML

JSON

{ "name": { "namespaceURI": "", "localPart": "myApp", "prefix": "", "key": "myApp", "string": "myApp" }, "value": { "TYPE_NAME": "generated.MyApp", "inputData": [{ "TYPE_NAME": "generated.MyApp.InputData", "dataType": "text", "mandatory": false, "length": 25, "valid": true, "value":null }] } }

Преобразовать в вывод XML (marshalString)

var context2 = new j.Context([generated2]); var marshaller2 = context2.createMarshaller(); var objectAsXMLString2 = marshaller2.marshalString(template2);

<myApp> <inputData> <dataType>text</dataType> <mandatory>false</mandatory> <length>25</length> <valid>true</valid> </inputData> </myApp>

Затем преобразование обратно в JSON (unmarshalString)

var unmarshaller2 = context2.createUnmarshaller(); var resultJSON2 = unmarshaller2.unmarshalString(objectAsXMLString2 );

{ "name": { "namespaceURI": "", "localPart": "myApp", "prefix": "", "key": "myApp", "string": "myApp" }, "value": { "TYPE_NAME": "generated.MyApp", "inputData": [{ "TYPE_NAME": "generated.MyApp.InputData", "dataType": "text", "mandatory": false, "length": 25, "valid": true }] } }

Итак, как вы видите, происходит потеря информации. Когда происходит полный цикл преобразования, JSON -> XML -> обратно в JSON, некоторые свойства не сохраняются. Все, что имеет значение null, отбрасывается - в данном случае это свойство 'value'. Это проблема для последующих приложений, которые ожидают наличия определенных свойств объекта.

Моя XML-схема, которая использовалась для создания объекта отображения jsonix, выглядит следующим образом

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="myApp"> <xs:complexType> <xs:sequence> <xs:element name="inputData" maxOccurs="unbounded" minOccurs="0"> <xs:complexType> <xs:sequence > <xs:element type="xs:string" name="dataType"/> <xs:element type="xs:boolean" name="mandatory"/> <xs:element type="xs:short" name="length"/> <xs:element type="xs:string" name="elementId"/> <xs:element type="xs:string" name="formId"/> <xs:element type="xs:anySimpleType" name="value" /> <xs:element type="xs:boolean" name="valid"/> <xs:element type="xs:short" name="precision"/> <xs:element type="xs:short" name="scale"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>

И сгенерированное отображение с использованием jsonix-schema-compiler

var generated_Module_Factory = function () { var generated = { name: 'generated', typeInfos: [{ localName: 'MyApp', typeName: null, propertyInfos: [{ name: 'inputData', minOccurs: 0, collection: true, elementName: { localPart: 'inputData' }, typeInfo: '.MyApp.InputData' }] }, { localName: 'MyApp.InputData', typeName: null, propertyInfos: [{ name: 'dataType', required: true, elementName: { localPart: 'dataType' } }, { name: 'mandatory', required: true, elementName: { localPart: 'mandatory' }, typeInfo: 'Boolean' }, { name: 'length', required: true, elementName: { localPart: 'length' }, typeInfo: 'Short' }, { name: 'elementId', required: true, elementName: { localPart: 'elementId' } }, { name: 'formId', required: true, elementName: { localPart: 'formId' } }, { name: 'value', required: true, elementName: { localPart: 'value' }, typeInfo: 'AnySimpleType' }, { name: 'valid', required: true, elementName: { localPart: 'valid' }, typeInfo: 'Boolean' }, { name: 'precision', required: true, elementName: { localPart: 'precision' }, typeInfo: 'Short' }, { name: 'scale', required: true, elementName: { localPart: 'scale' }, typeInfo: 'Short' }] }], elementInfos: [{ typeInfo: '.MyApp', elementName: { localPart: 'myApp' } }] }; return { generated: generated }; }; if (typeof define === 'function' && define.amd) { define([], generated_Module_Factory); } else { var generated_Module = generated_Module_Factory(); if (typeof module !== 'undefined' && module.exports) { module.exports.generated = generated_Module.generated; } else { var generated = generated_Module.generated; } }

Есть ли способ сохранить все свойства во время преобразования, даже если они нулевые?

1 ответ

Не сейчас.

Я думаю, что вы ищете поддержку nillable элементы, как вы, вероятно, хотите различать null против отсутствующего свойства против свойства с пустой строкой в ​​качестве значения.

Jsonix не поддерживает nillable элементы на данный момент.

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