使用 org.json 从 XML 转换为 JSON:如何保留数字格式?
Converting from XML to JSON using org.json: how to preserve number format?
我正在使用 org.json
lib:
将简单的 XML 转换为 JSON
import org.json.JSONObject;
import org.json.XML;
public class TestJson {
public static void test_number() {
String xml = "<BALANCE>32032033.10</BALANCE>";
JSONObject jsonObj = XML.toJSONObject(xml);
String json_str = jsonObj.toString(4);
System.out.println(String.format("%s\n----\n%s", xml, json_str));
}
public static void main(String[] args) {
try {
test_number();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我的结果:
<BALANCE>32032033.10</BALANCE>
----
{"BALANCE": 3.20320331E7}
如您所见,数字格式已从正常格式更改为科学格式。如何保留数字格式?我希望将 JSON 视为:
{"BALANCE": 32032033.10}
或者最好是字符串:
{"BALANCE": "32032033.10"}
我使用 org.json
来自 json-20190722.jar
您有一个 String
,您可以使用此行解析 JSON 获得:
String json_str = jsonObj.toString(4);
您可以通过从 String
创建 BigDecimal
并使用 setScale(...)
应用数字格式来保留或重置格式,如下所示:
public static void main(String[] args) {
String json_str = "3.20320331E7";
BigDecimal bigDecimal = new BigDecimal(json_str);
System.out.println(bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP));
}
该示例的输出 main
是这样的:
32032033.10
希望下面的代码有助于解决问题。请使用 XML.toJSONObject(xml,true)
而不是 XML.toJSONObject(xml);
import org.json.JSONObject;
import org.json.XML;
public class TestJson {
public static void test_number() {
String xml = "<BALANCE>32032033.10</BALANCE>";
JSONObject jsonObj = XML.toJSONObject(xml,true);
System.out.println(String.format("%s\n----\n%s", xml, jsonObj.toString()));
}
public static void main(String[] args) {
try {
test_number();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
<BALANCE>32032033.10</BALANCE>
----
{"BALANCE":"32032033.10"}
在这里您可以使用
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
</dependency>
那么您现有的代码将无需任何更改即可工作。
否则你想使用最新版本,即 json-20190722.jar
,然后你需要按照@vigneshwaran m.[=15= 的建议,在你的 toJSONObject(String string, boolean keepStrings)
方法中将 true 作为额外参数传递]
where @param keepStrings If true, then values will not be coerced into boolean
* or numeric values and will instead be left as strings
这来自 json-20190722.jar javadoc,请在此处查看 https://github.com/stleary/JSON-java/blob/master/XML.java
我正在使用 org.json
lib:
import org.json.JSONObject;
import org.json.XML;
public class TestJson {
public static void test_number() {
String xml = "<BALANCE>32032033.10</BALANCE>";
JSONObject jsonObj = XML.toJSONObject(xml);
String json_str = jsonObj.toString(4);
System.out.println(String.format("%s\n----\n%s", xml, json_str));
}
public static void main(String[] args) {
try {
test_number();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我的结果:
<BALANCE>32032033.10</BALANCE>
----
{"BALANCE": 3.20320331E7}
如您所见,数字格式已从正常格式更改为科学格式。如何保留数字格式?我希望将 JSON 视为:
{"BALANCE": 32032033.10}
或者最好是字符串:
{"BALANCE": "32032033.10"}
我使用 org.json
来自 json-20190722.jar
您有一个 String
,您可以使用此行解析 JSON 获得:
String json_str = jsonObj.toString(4);
您可以通过从 String
创建 BigDecimal
并使用 setScale(...)
应用数字格式来保留或重置格式,如下所示:
public static void main(String[] args) {
String json_str = "3.20320331E7";
BigDecimal bigDecimal = new BigDecimal(json_str);
System.out.println(bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP));
}
该示例的输出 main
是这样的:
32032033.10
希望下面的代码有助于解决问题。请使用 XML.toJSONObject(xml,true)
而不是 XML.toJSONObject(xml);
import org.json.JSONObject;
import org.json.XML;
public class TestJson {
public static void test_number() {
String xml = "<BALANCE>32032033.10</BALANCE>";
JSONObject jsonObj = XML.toJSONObject(xml,true);
System.out.println(String.format("%s\n----\n%s", xml, jsonObj.toString()));
}
public static void main(String[] args) {
try {
test_number();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
<BALANCE>32032033.10</BALANCE>
----
{"BALANCE":"32032033.10"}
在这里您可以使用
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
</dependency>
那么您现有的代码将无需任何更改即可工作。
否则你想使用最新版本,即 json-20190722.jar
,然后你需要按照@vigneshwaran m.[=15= 的建议,在你的 toJSONObject(String string, boolean keepStrings)
方法中将 true 作为额外参数传递]
where @param keepStrings If true, then values will not be coerced into boolean
* or numeric values and will instead be left as strings
这来自 json-20190722.jar javadoc,请在此处查看 https://github.com/stleary/JSON-java/blob/master/XML.java