Java: org.json.JSONObject - 创建一个新实例会从大小数中删除尾随零



以这个简短的JSON为例,使用RestAssured从API响应中获取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;
    }
    

    我建议使用更可定制的库,如杰克逊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方法来避免删除尾随零

    最新更新