【问题标题】:JSON to XML conversion without changing the sequenceJSON到XML的转换不改变顺序
【发布时间】:2017-08-04 20:50:06
【问题描述】:

我正在使用以下代码将 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>

输出的顺序正在改变。它无法保持实际顺序。有什么办法可以保持原样。

【问题讨论】:

  • 您使用的是哪个 JSON 库?
  • 为什么需要保持相同的顺序?

标签: java json xml


【解决方案1】:

直接使用org.json.JSONObject 是不可能的。原因是 JSONObject 使用 HashMap 类型的内部存储。 HashMap 不保留插入顺序

LinkedHashMap 是可能的,但似乎无法将 JSONObject 配置为使用一个。

/**
 * Construct an empty JSONObject.
 */
public JSONObject() {
    this.map = new HashMap<String, Object>();
}

另一种方法是使用确实保留顺序的库进行读取,例如杰克逊....

ObjectMapper mapper = new ObjectMapper();
JsonNode jackson = mapper.readTree(fullRequest);

然后将其输入 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;
    }

}

输出

<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>

【讨论】:

  • 这不适用于您的嵌入式 Json 数组。我在 xml 中将嵌入的数组设为空白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多