J'ai remarqué que dans ma conversion de JSON en XML, si l'un de mes objets JSON est nulle, l'objet est absent du XML, par exemplepropriétés nulles sont abandonnées au cours de triage/unmarshalling avec JSONIX
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 }] } }
Convertir en sortie 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>
ensuite reconvertir à nouveau à 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 }] } }
Comme vous voyez, il y a une perte d'information. Lorsque le cycle complet de conversion se produit, JSON -> XML -> retour à JSON, certaines propriétés ne sont pas conservées. Tout ce qui est nul est supprimé - dans ce cas, c'est la propriété 'valeur'. C'est un problème pour les applications en aval qui attendent certaines propriétés sur un objet.
Mon schéma XML qui a été utilisé pour générer l'objet de mappage de jsonix ressemble à ceci
<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>
et la cartographie générée à l'aide jsonix-schéma compilateur est
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; } }
Y at-il un manière de préserver toutes les propriétés lors de la conversion, même si elles sont nulles?