忽略JSON到XML转换中的密钥

时间:2019-04-30 12:35:25

标签: java json xml xml-parsing

我正在使用json库将json转换为xml,但是在转换时,我想忽略要转换为xml标签的嵌套json对象。

例如

平面json为

{"id":"9568","name":"Customer Analysis","group":"demo","param":{"globalSettings":{"showLegends":false,"legendPosition":"bottom center"}}}

JSONObject json = new JSONObject("{\"id\":\"9568\",\"name\":\"Customer Analysis\",\"group\":\"demo\",\"param\":{\"globalSettings\":{\"showLegends\":false,\"legendPosition\":\"bottom center\"}}}");

    String xml = XML.toString(json);
    System.out.println(xml);

现在在上面的示例中,我想在xml中使用json,因为它位于其中。现在,在globalSettings中为showLegends和legendPosition创建了各种元素。

当前XML如下:

<name>Customer Analysis</name>
<id>9568</id>
<group>demo</group>
<param>
  <globalSettings>
     <showLegends>false</showLegends>
     <legendPosition>bottom center</legendPosition>
  </globalSettings>
</param>

期望的XML应该如下:

<name>Customer Analysis</name>
<id>9568</id>
<group>demo</group>
<param>
  <globalSettings>
     {"showLegends":false,"legendPosition":"bottom center"}
  </globalSettings>
</param>

我该如何处理?

4 个答案:

答案 0 :(得分:2)

我认为您需要在转换之前调整JSON。 您可以在下面试试吗?

String json = "{\n" +
        "   \"user\": \"gerry\",\n" +
        "   \"likes\": [1, 2, 4],\n" +
        "   \"followers\": {\n" +
        "      \"options\": {\n" +
        "        \"key1\": \"a\",\n" +
        "        \"key2\": \"b\"\n" +
        "      }        \n" +
        "   }\n" +
        "}";

JSONObject jsonObject = new JSONObject(json);
JSONObject followers = jsonObject.getJSONObject("followers");

String options = followers.optString("options");
followers.put("options", options);

String s = XML.toString(jsonObject);
System.out.println(XML.unescape(s));

结果:

<followers><options>{"key1":"a","key2":"b"}</options></followers><user>gerry</user><likes>[1,2,4]</likes>


其他问题:

  

如果我不希望将选项作为xml元素并将其作为json的一部分怎么办?

String json = "{\n" +
        "   \"user\": \"gerry\",\n" +
        "   \"likes\": [1, 2, 4],\n" +
        "   \"followers\": {\n" +
        "      \"options\": {\n" +
        "        \"key1\": \"a\",\n" +
        "        \"key2\": \"b\"\n" +
        "      }        \n" +
        "   }\n" +
        "}";

JSONObject jsonObject = new JSONObject(json);
jsonObject.put("followers", jsonObject.optString("followers"));

// org.json 20180813
String s = XML.toString(jsonObject);
System.out.println(XML.unescape(s));

结果:

<followers>{"options":{"key1":"a","key2":"b"}}</followers><user>gerry</user><likes>1</likes><likes>2</likes><likes>4</likes>

答案 1 :(得分:0)

您需要稍微修改json:

    String json = "{\"user\":\"gerry\",\"likes\":[1,2,4],\"followers\":{\"options\":\"{key1:a,key2:b}\"}}";

    JSONObject jsonObject = new JSONObject(json);
    String xml = XML.toString(jsonObject);

    System.out.println(XML.unescape(xml));

请注意,“选项”应为“字符串”(形状类似于JSON),然后XML解析器会将其视为常规字符串。

答案 2 :(得分:0)

您要么需要在转换前调整JSON,要么在转换后调整XML。

由于经常需要这种调整,因此一种方法是使用XSLT 3.0进行转换,因此您具有内置的转换功能。

答案 3 :(得分:0)

Underscore-java库具有静态方法U.fromJson(json)U.toXml(map)。您可以修改地图并生成xml。我是该项目的维护者。

    Map<String, Object> map = U.fromJsonMap("{\"id\":\"9568\",\"name\":\"Customer Analysis\",\"group\":\"demo\",\"param\":{\"globalSettings\":{\"showLegends\":false,\"legendPosition\":\"bottom center\"}}}");
    U.set(map, "param.globalSettings", U.toJson((Map<String, Object>) U.get(map, "param.globalSettings")));
    System.out.println(U.toXml(map));

输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <id>9568</id>
  <name>Customer Analysis</name>
  <group>demo</group>
  <param>
    <globalSettings>{
  "showLegends": false,
  "legendPosition": "bottom center"
}</globalSettings>
  </param>
</root>