Java JSON到XML的转换,无需更改序列
我使用下面的代码将json转换为具有不同json结构的多个xml文件的xmlJava JSON到XML的转换,无需更改序列,java,json,xml,Java,Json,Xml,我使用下面的代码将json转换为具有不同json结构的多个xml文件的xml String toXmlRequest = fullRequest.toString(); JSONObject jsonObj = new JSONObject(toXmlRequest); String XmlRequest = XML.toString(jsonObj); System.out.println(XmlRequest); 输入 {
String toXmlRequest = fullRequest.toString();
JSONObject jsonObj = new JSONObject(toXmlRequest);
String XmlRequest = XML.toString(jsonObj);
System.out.println(XmlRequest);
输入
{
"EnrollmentRequest":
{
"data":
{
"commonDataContext":
{
"requestId": "ADA12131",
"clientId": "ABCDEF",
"timestamp":"2013-12-13T11:10:00.715-05:00"
},
"cardNumber" : "123456789012345" ,
"firstName" : "John" ,
"lastName" : "Smith" ,
"email" : "JohnSmith@g.com" ,
"enrollStatus" : "E" ,
"pathEnroll" : "NewAcct",
"cardSavedIndicator" : "Y"
}
}
}
<EnrollmentRequest>
<data>
<firstName>John</firstName>
<lastName>Smith</lastName>
<commonDataContext>
<clientId>ABCDEF</clientId>
<requestId>ADA12131</requestId>
<timestamp>2013-12-13T11:10:00.715-05:00</timestamp>
</commonDataContext>
<pathEnroll>NewAcct</pathEnroll>
<enrollStatus>E</enrollStatus>
<cardSavedIndicator>Y</cardSavedIndicator>
<cardNumber>123456789012345</cardNumber>
<email>JohnSmith@g.com</email>
</data>
</EnrollmentRequest>
输出
{
"EnrollmentRequest":
{
"data":
{
"commonDataContext":
{
"requestId": "ADA12131",
"clientId": "ABCDEF",
"timestamp":"2013-12-13T11:10:00.715-05:00"
},
"cardNumber" : "123456789012345" ,
"firstName" : "John" ,
"lastName" : "Smith" ,
"email" : "JohnSmith@g.com" ,
"enrollStatus" : "E" ,
"pathEnroll" : "NewAcct",
"cardSavedIndicator" : "Y"
}
}
}
<EnrollmentRequest>
<data>
<firstName>John</firstName>
<lastName>Smith</lastName>
<commonDataContext>
<clientId>ABCDEF</clientId>
<requestId>ADA12131</requestId>
<timestamp>2013-12-13T11:10:00.715-05:00</timestamp>
</commonDataContext>
<pathEnroll>NewAcct</pathEnroll>
<enrollStatus>E</enrollStatus>
<cardSavedIndicator>Y</cardSavedIndicator>
<cardNumber>123456789012345</cardNumber>
<email>JohnSmith@g.com</email>
</data>
</EnrollmentRequest>
约翰
史密斯
ABCDEF
ADA12131
2013-12-13T11:10:00.715-05:00
新会计
E
Y
123456789012345
JohnSmith@g.com
输出的顺序正在更改。它无法保持实际的顺序。有什么办法可以保持原封不动吗 这不可能直接使用
org.json.JSONObject
。原因是JSONObject使用HashMap类型的内部存储。HashMap不保留插入顺序
可以使用LinkedHashMap
,但似乎无法将JSONObject配置为使用一个
/**
* Construct an empty JSONObject.
*/
public JSONObject() {
this.map = new HashMap<String, Object>();
}
然后将其输入XML
String xmlRequest = XML.toString(new JSONAdapter(jackson));
通过必要的类型调整,使Jackson对象看起来像org.json.JSONObject。下面的例子不完整:
private static class JSONAdapter extends JSONObject {
private JsonNode jackson;
public JSONAdapter(JsonNode jackson) {
this.jackson = jackson;
}
@Override
public Iterator<String> keys() {
return jackson.fieldNames();
}
@Override
public Object opt(String key) {
return get(key);
}
@Override
public Object get(String key) throws JSONException {
JsonNode nested = jackson.get(key);
if (nested.isObject()) {
return new JSONAdapter(nested);
} else if (nested.isTextual()) {
return nested.asText();
} else if (nested.isNumber()) {
return nested.asDouble();
} else if (nested.isBoolean()) {
return nested.asBoolean();
}
return null;
}
}
私有静态类JSONAdapter扩展了JSONObject{
私有JsonNode-jackson;
公共JSONAdapter(JsonNode){
this.jackson=jackson;
}
@凌驾
公共迭代器密钥(){
返回jackson.fieldNames();
}
@凌驾
公共对象选项(字符串键){
返回get(键);
}
@凌驾
公共对象get(字符串键)抛出JSONException{
JsonNode-nested=jackson.get(key);
if(嵌套的.isObject()){
返回新的JSONAdapter(嵌套);
}else if(嵌套.isTextual()){
返回nested.asText();
}else if(嵌套的.isNumber()){
返回nested.asDouble();
}else if(嵌套的.isBoolean()){
返回nested.asBoolean();
}
返回null;
}
}
输出
<EnrollmentRequest>
<data>
<commonDataContext>
<requestId>ADA12131</requestId>
<clientId>ABCDEF</clientId>
<timestamp>2013-12-13T11:10:00.715-05:00</timestamp>
</commonDataContext>
<cardNumber>123456789012345</cardNumber>
<firstName>John</firstName>
<lastName>Smith</lastName>
<email>JohnSmith@g.com</email>
<enrollStatus>E</enrollStatus>
<pathEnroll>NewAcct</pathEnroll>
<cardSavedIndicator>Y</cardSavedIndicator>
</data>
</EnrollmentRequest>
ADA12131
ABCDEF
2013-12-13T11:10:00.715-05:00
123456789012345
约翰
史密斯
JohnSmith@g.com
E
新会计
Y
您使用的是哪个JSON库?为什么需要保持相同的顺序?这不适用于嵌入式JSON数组。我得到的嵌入数组在xml中为空。