在JSONUtil.toJsonStr中,如果对象中的数字大小超过JS中定义的最大大小,会溢出
mPandaer opened this issue · 1 comments
mPandaer commented
版本情况
JDK版本: zulu11.70.15
hutool版本: 5.8.26
问题描述(包括截图)
超大数字在浏览器环境以及Node环境中,从JSON字符串转换为JSON对象时,数字会溢出,出现不可意料的结果
- 复现代码
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中,会将这个大的数字转换为字符串。
looly commented
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));