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

时间:2018-04-04 03:00:40

标签: java json rest-assured web-api-testing org.json

例如,使用String从API响应中将此短JSON视为RestAssured

{
    "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>
    

    感谢帮助!

  • 2 个答案:

    答案 0 :(得分:1)

    您将无法使用 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
    }
    

    如果您愿意,它也会映射到对象。

    答案 1 :(得分:0)

    单向是使用字符串而不是数字,例如

    {
    "buyAmount": "473935.00",
    "sellAmount":"585538.30",
    } 
    

    如果您使用BigDecimal使用toPlainString方法以避免删除尾随零