Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSON到XML的转换,无需更改序列_Java_Json_Xml - Fatal编程技术网

Java JSON到XML的转换,无需更改序列

Java 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); 输入 {

我使用下面的代码将json转换为具有不同json结构的多个xml文件的xml

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中为空。