簡體   English   中英

Java:org.json.JSONObject-創建新實例可從大十進制中刪除尾隨零

[英]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"
}

請注意,剝離了數量節點的尾隨零。 在我看來,這似乎是一個錯誤,但沒有人知道解決方法/解決方案如何防止這種情況發生嗎?

一些注意事項:

  • 我想使用相同的庫(org.json)解決此問題
  • 如果可能的話,我想從一個字符串構造實例,就像我現在正在做的那樣

    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;
    }
    

    我建議使用更可定制的庫,例如jacksongson

    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.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM