gson.toJson(对象)BigDecimal Precision Lost

Sur*_*ali 5 java json gson jsonobject

当我将Object转换为Json时,我遇到了BigDecimal Precision丢失的问题.
让我说我有Pojo课,

public class DummyPojo {
    private BigDecimal amount;
    private String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public BigDecimal getAmount() {
        return amount;
    }
    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }
} 
Run Code Online (Sandbox Code Playgroud)

现在我正在为Pojo设置值,然后转换为JSON

public static void main(String[] args) {
        BigDecimal big = new BigDecimal("1000.0005");
        JSONObject resultJson = new JSONObject();
        DummyPojo summary = new DummyPojo();
        summary.setId("A001");
        summary.setAmount(big);

        resultJson.put("summary",new Gson().toJson(summary));
        String result = resultJson.toString();
        System.out.println(result);
    }
Run Code Online (Sandbox Code Playgroud)

第一次测试 - 正确输出

Output -> {"summary":{"amount":1000.0005,"id":"A001"}}
Run Code Online (Sandbox Code Playgroud)

第二次测试 - 输出错误(丢失BigDecimal精度)

BigDecimal big = new BigDecimal("1234567.5555"); //Changed the value
Output -> {"summary":{"amount":1234567.5,"id":"A001"}}
Run Code Online (Sandbox Code Playgroud)

第3次测试 - 输出错误(丢失BigDecimal精度)

BigDecimal big = new BigDecimal("100000.0005"); //Changed the value
Output -> {"summary":{"amount":100000,"id":"A001"}}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,每当BigDecimal值更长时,它也会截断小数位.json coversion有什么问题.你能帮我解决一下吗?

Kev*_*sox 3

我认为您将 Java EE 7 的JSONObject与 GSON 的JsonObject混合在一起。Gson似乎没有你提到的问题:

public static void main(String[] args) {
    BigDecimal big = new BigDecimal("1234567.5555");
    DummyPojo summary = new DummyPojo();
    JsonObject resultJson = new JsonObject(); //this is Gson not Java EE 7
    summary.setId("A001");
    summary.setAmount(big);
    resultJson.addProperty("summary", new Gson().toJson(summary));
    System.out.println(resultJson.toString());
    //Outputs: {"summary":"{\"amount\":1234567.5555,\"id\":\"A001\"}"}
}
Run Code Online (Sandbox Code Playgroud)