dromara/hutool

在JSONUtil.toJsonStr中,如果对象中的数字大小超过JS中定义的最大大小,会溢出

mPandaer opened this issue · 1 comments

版本情况

JDK版本: zulu11.70.15
hutool版本: 5.8.26

问题描述(包括截图)

超大数字在浏览器环境以及Node环境中,从JSON字符串转换为JSON对象时,数字会溢出,出现不可意料的结果

  1. 复现代码
public class Main {
    public static void main(String[] args) {
        Demo demo = new Demo();
        demo.setId(1227690722069581409L);
        demo.setName("pandaer");
        String jsonStr = JSONUtil.toJsonStr(demo);
        System.out.println(jsonStr);
    }
}

public class Demo {
    private Long id;
    private String name;

    public java.lang.Long getId() {
        return id;
    }

    public void setId(java.lang.Long id) {
        this.id = id;
    }

    public java.lang.String getName() {
        return name;
    }

    public void setName(java.lang.String name) {
        this.name = name;
    }
}

输出信息:{"id":1227690722069581409,"name":"pandaer"}
json_str = '{"id":1227690722069581409,"name":"pandaer"}';
s = JSON.parse(json_str);
console.log(s);

 输出信息:{ id: 1227690722069581300, name: 'pandaer' }

数字对比
1227690722069581409
1227690722069581300

数字溢出,但是在Jackson中,会将这个大的数字转换为字符串。

5.8.28增加一个选项,JSONConfig.create().setWriteLongAsString(true)可以选择是否将long的值写出为String模式。

String jsonStr = JSONUtil.toJsonStr(demo, JSONConfig.create().setWriteLongAsString(true));

6.0.0增加修改:

final String jsonStr = JSONUtil.toJsonStr(demo, JSONConfig.of().setNumberWriteMode(NumberWriteMode.STRING));