XML 到 JSON 产生了不希望的结果

XML to JSON producing undesired results

我正在使用 org.json 库,如下所示,将 XML 转换为 JSON

  <dependency>
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>20160212</version>
  </dependency>

一个简单的测试用例显示了我遇到的问题,见下文:-

我有以下XML

<record>
  <name>A108B</name>
</record>

这反过来会产生

{"record": { "id": "A108B" }}

太棒了!如果 id1111

,就会出现问题

使用以下代码

XML.toJSONObject(xml...)

我明白了

{"record": { "name": 1111 }}

我实际上更愿意将值保留为所有字符串,即用户标识符。我不希望输出根据标识符中是否恰好没有字符而改变。

有什么方法可以强制 org.json 这样做吗?我可能可以分叉代码并为自己进行更改,但我希望这是其他人遇到的问题并且有解决方案。

XML.toJSONObject(...) 内部调用 static Object stringToValue(String string),它将 始终 尝试将值转换为 BooleanJSONObject.Null、[=首先是 15=] 和 Double,只有当所有转换尝试都失败时才 return 和 String。似乎没有(简单的)解决方法。

而不是分叉或做一些反射魔术,你可以在读取时简单地转换值:

JSONObject rec = json.getJSONObject("record");
String name = rec
                .get("name")
                .toString();

// optionally put the string value back into your JSON:
rec.put("name", name);

这似乎可以解决问题,我不得不覆盖 JSONTokener 的 nextValue

    String xml = "<test>111</test>";
    JSONObject json = XML.toJSONObject(xml);
    JSONTokener tokener = new JSONTokener(json.toString()) {
        public Object nextValue() throws JSONException {
            Object nextValue = super.nextValue();
            if (nextValue instanceof Number) {
                Number value = (Number) nextValue;
                return value.toString();
            }
            return nextValue;
        }
    };
    json = new JSONObject(tokener);
    System.out.println(json.toString());

输出:{"test":"111"}