【问题标题】:Converting xml of any structure to json with nested arrays使用嵌套数组将任何结构的 xml 转换为 json
【发布时间】:2020-07-18 16:58:44
【问题描述】:

我有 XML,它可以是任何结构,如下所示。因此没有用于实例化的 POJO 类。如您所见,我有嵌套数组(在这种情况下,reservations 是两个reservation 的数组,每个reservation 都有简单的元素和rooms 的数组-但这只是示例-可能还有更多数组和嵌套数组)。

<reservations>
    <reservation>
        <id>1318504</id>
        <add_date>2020-12-10 12:48:09</add_date>
        <rooms>  
            <room>
                <id>28902</id>
                <floor>2</floor>
            </room>  
            <room>
                <id>28903</id>
                <floor>3</floor>
            </room>
        </rooms>
    </reservation >
    <reservation>
        <id>1318501</id>
        <add_date>2021-05-07 07:47:05</add_date>
        <rooms>
            <room>
                <id>5</id>
                <floor>25</floor>
            </room>
            <room>
                <id>6</id>
            </room>
        </rooms>
    </reservation>
</reservations>

我需要将其转换为 Json 为:

{
   "reservations":[
      {
         "id":"1318504",
         "add_date":"2020-12-10 12:48:09",
         "rooms":[
            {
               "id":"28902",
               "floor":2
               
            },
            {
               "id":"28903",
               "floor":3
            }
         ]
      },
      {
         "id":"1318501",
         "add_date":"2021-05-07 07:47:05",
         "rooms":[
            {
               "id":"5",
               "floor":25
               
            },
            {
               "id":"6"
            }
         ]
      }
   ]
}

 

我已经阅读了很多关于将 XML 转换为 Json 的主题。我试过类似的东西:

  1. json.org

    JSONObject xmlJSONObj = XML.toJSONObject(xmlString);

  2. 杰克逊

    JsonNode node = new XmlMapper().readTree(xmlContent);

  3. 下划线-java

    String jsonString = U.xmlToJson(xmlContent)

等等。但结果,最好的情况是:

{
   "reservations":{
      "reservation":[
         {
            "rooms":{
               "room":[
                  {
                     "id":28902,
                     "floor":2
                  },
                  {
                     "id":28903,
                     "floor":3
                  }
               ]
            },
            "add_date":"2020-12-10 12:48:09",
            "id":1318504
         },
         {
            "rooms":{
               "room":[
                  {
                     "id":5,
                     "floor":25
                  },
                  {
                     "id":6
                  }
               ]
            },
            "add_date":"2021-05-07 07:47:05",
            "id":1318501
         }
      ]
   }
}

我不需要像 reservationroom 这样的节点。你能帮我解决这个问题吗?我可以使用 xml 或 json 进行操作,但没有这些节点的表单是我的目标。

【问题讨论】:

  • Underscore-java库有一个静态方法U.xmlToJson(xml)。
  • @ValentynKolesnikov 在我看来这种方法行不通。你能告诉我如何在我的情况下使用它吗?
  • 它将转换成这个 json: { "reservations": { "reservation": [ { "id": "1318504", "add_date": "2020-12-10 12:48:09 ”,“房间”:{“房间”:[{“id”:“28902”,“地板”:“2”},{“id”:“28903”,“地板”:“3”}]}} , { "id": "1318501", "add_date": "2021-05-07 07:47:05", ... }
  • 请再次阅读我在主题中的问题...
  • 我添加了解决方案。

标签: java json xml-parsing xml-to-json underscore-java


【解决方案1】:

解决办法:

import com.github.underscore.U;

    String xml = "<reservations>\n"
          + "    <reservation>\n"
          + "        <id>1318504</id>\n"
          + "        <add_date>2020-12-10 12:48:09</add_date>\n"
          + "        <rooms>  \n"
          + "            <room>\n"
          + "                <id>28902</id>\n"
          + "                <floor>2</floor>\n"
          + "            </room>  \n"
          + "            <room>\n"
          + "                <id>28903</id>\n"
          + "                <floor>3</floor>\n"
          + "            </room>\n"
          + "        </rooms>\n"
          + "    </reservation >\n"
          + "    <reservation>\n"
          + "        <id>1318501</id>\n"
          + "        <add_date>2021-05-07 07:47:05</add_date>\n"
          + "        <rooms>\n"
          + "            <room>\n"
          + "                <id>5</id>\n"
          + "                <floor>25</floor>\n"
          + "            </room>\n"
          + "            <room>\n"
          + "                <id>6</id>\n"
          + "            </room>\n"
          + "        </rooms>\n"
          + "    </reservation>\n"
          + "</reservations>";
    Map<String, Object> map = U.fromXmlMap(xml);
    U.set(map, "reservations", U.get(map, "reservations.reservation"));
    List<Map<String, Object>> list = U.get(map, "reservations");
    for (Map<String, Object> item : list) {
        U.set(item, "rooms", U.get(item, "rooms.room"));
    }
    System.out.println(U.toJson(map));

结果:

{
  "reservations": [
    {
      "id": "1318504",
      "add_date": "2020-12-10 12:48:09",
      "rooms": [
        {
          "id": "28902",
          "floor": "2"
        },
        {
          "id": "28903",
          "floor": "3"
        }
      ]
    },
    {
      "id": "1318501",
      "add_date": "2021-05-07 07:47:05",
      "rooms": [
        {
          "id": "5",
          "floor": "25"
        },
        {
          "id": "6"
        }
      ]
    }
  ],
  "#omit-xml-declaration": "yes"
}

【讨论】:

    猜你喜欢
    • 2014-10-13
    • 2021-02-09
    • 2014-08-24
    • 2015-12-11
    • 2020-03-07
    • 2017-03-21
    • 1970-01-01
    • 2021-08-26
    • 2021-04-13
    相关资源
    最近更新 更多