![](/img/trans.png)
[英]org.json.JSONObject creating JSONObject from string threw java.lang.RuntimeException
[英]Java: org.json.JSONObject - creating a new instance removes trailing zeros from big decimals
例如,使用RestAssured
從API響應RestAssured
這個簡短的JSON用作String
:
{
"id": "4d27afb18bfa4eb5917beee9aaddfa76",
"hedgeId": 205598,
"sellCurrency": "USD",
"buyCurrency": "EUR",
"buyAmount": 473935.00,
"sellAmount": 585538.30,
}
每當我做JSONObject foo = new JSONObject(thatStringAbove);
,將創建此實例:
{
"hedgeId": 205598,
"buyAmount": 473935,
"sellAmount": 585538.3,
"id": "4d27afb18bfa4eb5917beee9aaddfa76",
"sellCurrency": "USD",
"buyCurrency": "EUR"
}
請注意,剝離了數量節點的尾隨零。 在我看來,這似乎是一個錯誤,但沒有人知道解決方法/解決方案如何防止這種情況發生嗎?
一些注意事項:
Maven的依賴:
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20170516</version> </dependency>
感謝幫助!
您將無法使用org.json庫執行此操作 。 它在序列化過程中故意剝離尾隨零。
從相關方法JSONObject.numberToString()
:
public static String numberToString(Number number) throws JSONException {
if (number == null) {
throw new JSONException("Null pointer");
}
testValidity(number);
// Shave off trailing zeros and decimal point, if possible.
String string = number.toString();
if (string.indexOf('.') > 0 && string.indexOf('e') < 0
&& string.indexOf('E') < 0) {
while (string.endsWith("0")) {
string = string.substring(0, string.length() - 1);
}
if (string.endsWith(".")) {
string = string.substring(0, string.length() - 1);
}
}
return string;
}
我建議使用更可定制的庫,例如jackson或gson 。
Gson將尊重數字的標度,使您可以執行往返旅行而不會丟失尾隨零:
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonObject jsonObject = gson.fromJson(in, JsonObject.class);
System.out.println(gson.toJson(jsonObject));
輸出:
{
"id": "4d27afb18bfa4eb5917beee9aaddfa76",
"hedgeId": 205598,
"sellCurrency": "USD",
"buyCurrency": "EUR",
"buyAmount": 473935.00,
"sellAmount": 585538.30
}
如果需要,它還將映射到對象。
一種方法是使用字符串而不是數字,例如
{
"buyAmount": "473935.00",
"sellAmount":"585538.30",
}
如果您使用的是BigDecimal
請使用toPlainString
方法來避免刪除尾隨零
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.