我注意到在从 JSON 到 XML 的转换中,如果我的 JSON 对象之一为空,则 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,一些属性没有保留。任何为空的东西都会被丢弃——在这种情况下,它是属性“值”。对于期望对象上存在某些属性的下游应用程序来说,这是一个问题。
我用于生成 jsonix 映射对象的 XML 模式如下所示
<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;
}
}
有没有办法在转换过程中保留所有属性,即使它们为空?