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" }}
太棒了!如果 id
是 1111
,就会出现问题
使用以下代码
XML.toJSONObject(xml...)
我明白了
{"record": { "name": 1111 }}
我实际上更愿意将值保留为所有字符串,即用户标识符。我不希望输出根据标识符中是否恰好没有字符而改变。
有什么方法可以强制 org.json 这样做吗?我可能可以分叉代码并为自己进行更改,但我希望这是其他人遇到的问题并且有解决方案。
XML.toJSONObject(...)
内部调用 static Object stringToValue(String string)
,它将 始终 尝试将值转换为 Boolean
、JSONObject.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"}
我正在使用 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" }}
太棒了!如果 id
是 1111
使用以下代码
XML.toJSONObject(xml...)
我明白了
{"record": { "name": 1111 }}
我实际上更愿意将值保留为所有字符串,即用户标识符。我不希望输出根据标识符中是否恰好没有字符而改变。
有什么方法可以强制 org.json 这样做吗?我可能可以分叉代码并为自己进行更改,但我希望这是其他人遇到的问题并且有解决方案。
XML.toJSONObject(...)
内部调用 static Object stringToValue(String string)
,它将 始终 尝试将值转换为 Boolean
、JSONObject.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"}