2017-08-17 1 views
0

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?

Répondre

0

Pas pour le moment.

Je pense que ce que vous cherchez est support pour nillable éléments que vous voulez probablement distinguer null vs propriété abstraite vs propriété avec la chaîne vide comme valeur.

Jsonix ne prend pas en charge les éléments nillable pour le moment.