【问题标题】:Ignore a key in JSON to XML conversion忽略 JSON 到 XML 转换中的键
【发布时间】:2019-09-19 03:01:24
【问题描述】:

我正在使用 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);

现在在上面的例子中,我想在里面有一个 json 的 xml。而现在在 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>

我该如何处理?

【问题讨论】:

  • 你使用的是哪个库?
  • @AdiOhana org.json
  • 上述 JSON 示例的预期 XML 输出是什么?你能把它加到帖子里吗?如果您使用 POJO,有一种方法可以忽略 JSON 中的某些属性 - baeldung.com/jackson-ignore-properties-on-serialization stackoverflow.com/questions/5455014/…
  • @PratikRawlekar 因为你有 var 局部变量。您不能在将其转换为 json 之前删除不需要的键和值,然后再转换为 xml 尝试忽略键吗?
  • @AdiOhana 请找到更新的回复。我没有使用 POJO

标签: java json xml xml-parsing


【解决方案1】:

我认为您需要在转换之前调整 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>

【讨论】:

  • 感谢您的回复。我无法在 XML 上找到 unescape(),但我们可以使用 StringEscapeUtils.unescapeXml(s) 来实现
  • 当我尝试使用 JSONObject obj = XML.toJSONObject(s) 将此 xml 转换为 json 时,\ 将打印在选项字符串中。我该如何克服呢?同样在您给出的上述解决方案中,如果我不希望将选项作为 xml 元素并且它应该是 json 的一部分,该怎么办?
  • @PratikRawlekar 我测试了它,但 \ 没有打印出来。我使用了 org.json 版本20180813
  • 我当前的版本是 20150729,但我也尝试使用 udpdated 版本 20180813。当我将它从 xml 转换为 json 时仍然面临同样的问题。
【解决方案2】:

你需要稍微修改一下你的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 解析器会将其视为常规字符串。

【讨论】:

    【解决方案3】:

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

    由于经常需要进行此类调整,因此一种方法是使用 XSLT 3.0 进行转换,这样您就可以在工具中内置转换功能。

    【讨论】:

      【解决方案4】:

      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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多