当前位置: 首页 > 知识库问答 >
问题:

格森。toJson(对象)BigDecimal精度丢失

容远
2023-03-14

当我将Object转换为Json时,我遇到了大十进制精度丢失的问题。
假设我有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;
    }
} 

现在我将值设置为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);
    }

第一次测试-正确输出

Output -> {"summary":{"amount":1000.0005,"id":"A001"}}

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

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

第三次测试-输出错误(失去BigDecimal精度)

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

令人惊讶的是,每当BigDecimal值的长度更大时,它也会截断小数点。json转换有什么问题。你能给我提供解决方案吗?

共有1个答案

袁赞
2023-03-14

我认为您将JavaEE7的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\"}"}
}
 类似资料:
  • 我正在尝试使用方法,但它正在重新生成类的对象哈希代码,例如: 但是,我可以检索用户。没有任何问题和所有关系的专业知识: 这是我的Gson方法: 这是我的MyTypeAdapter: } 那么,如何让实际返回一个Json字符串,以便我可以使用Gson. FromJson在我的另一端?提前谢谢。

  • 用户错误报告显示偶尔会返回,但对于大多数用户来说,它工作正常。 我访问了一位用户,他在手机上遇到了错误并调试了应用程序,我制作了来显示发送到服务器的内容,我看到Toast显示了,并且记录和ID不是。 这是我所做的。 这里我做序列化对象 但是)对于一些用户来说是正确的,但是对于一些用户来说返回 服务器数据库显示一些用户发送了数据,但一些用户发送了正确的json。经过一些研究,我发现了新的Gson()

  • 我想从我的对象生成一个JSON字符串: 每次我尝试这样做,我得到这个错误: 这些是我的BomItem类的属性: 我引用的BomModule类的属性: 知道是什么导致了这个错误吗?我该如何修复它?

  • 我有以下输出: 但问题是玩家阵列来得太早,部分初始细节被遗漏了。 这是我的代码: 你可以在这篇文章中找到游戏、玩家头像和游戏玩家类的详细信息:https://stackoverflow.com/a/33048622 有人知道我怎样才能正确订购这个吗?

  • 问题内容: 我知道以下行为是一个老问题,但我仍然不明白。 或者即使我使用 为什么这个结果是:而不是:? 我该如何解决? 问题答案: 你真正想要的是 该构造得到的所有的不精确性,所以由你说的时候,你已经引入了舍入误差。使用构造函数可避免与通过导致的舍入错误。

  • 问题内容: 我在ResultSet.getDate(x)调用中失去了精度。基本上: 返回的日期被截断为MODIFIED是默认精度的Oracle TIMESTAMP字段的日期。我认为可能缺少一些JDBC调整;通常,TIMESTAMP与DATE兼容,但我希望不必重新定义整个表。 问题答案: 传回,而不是。它被定义为一个永恒的日期。如果需要时间戳记,请使用!