我在测试的过程中发现,如果用WriteBigDecimalAsPlain直接返回一个BigDecimal的对象是OK的,如果将BigDecimal类型作为一个对象的属性返回,就会有科学计数的情况发生。
Q
[alibaba/fastjson]WriteBigDecimalAsPlain如果将BigDecimal类型作为一个类的属性返回就不行?
0
A
回答
1
目前有什么解决方案吗?
0
same question
{ msg: "success", code: 0, data: { bigDecimalFloatStr: "1.23E-17", bigDecimalStr: "100000000000000000123", bigIntegerStr: "99999999999999999999999999", longStr: "9223372036854775807" } }
不知道为何使用
修复Long的的边界精度问题时,没有顺便修复一下BigDecimal的。
虽然可以自己写序列化咯
2
同问
7
解决方案: 1、首先解决long型的
fastJsonConfig.setSerializerFeatures(
...
SerializerFeature.BrowserCompatible // 增加浏览器兼容的解决long长整型超过js安全值问题
)
2、另外解决bigdecimal的
public class BigDecimalToStringSerizlizer implements ObjectSerializer {
public static final BigDecimalToStringSerizlizer instance = new BigDecimalToStringSerizlizer();
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
int features) throws IOException {
SerializeWriter out = serializer.out;
if (object == null) {
out.writeNull();
return;
}
out.writeString(((BigDecimal) object).toPlainString());
}
}
然后
SerializeConfig serializeConfig = SerializeConfig.globalInstance;
serializeConfig.put(BigDecimal.class, BigDecimalToStringSerizlizer.instance);
fastJsonConfig.setSerializeConfig(serializeConfig);
8
测试结果
{
"code": 200,
"data": {
"bigFloat": "1230000000000000000000000.0000000000000000000000000023",
"bigInt": "100000000000000000000",
"lg": "9007199254740993",
"onlyFloat": "0.000000000000000000001"
}
}
7
这个问题在最新版的 1.2.72 中还是存在!
WriteBigDecimalAsPlain直接返回一个BigDecimal的对象是OK的,如果将BigDecimal类型作为一个对象的属性返回,就会有科学计数的情况发生!
请问这个bug大概何时可以修复一下,总是自己去写一个 Serialize 也不太合适
1
@gooking 能提供 testcase 么
4
@gooking 能提供 testcase 么
我也遇到了,这个情况是普遍存在的,WriteBigDecimalAsPlain与BrowserCompatible 都有问题。
fastjson版本:1.2.76
测试用例
public class MyTest {
public static void main(String[] args) {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("id1", new BigDecimal("-9223370018640066466"));
map.put("id2", new BigDecimal("9223370018640066466"));
map.put("id3", new BigDecimal("100"));
map.put("id4", new BigDecimal("5404232244754964480"));
String s = JSON.toJSONString(map, SerializerFeature.BrowserCompatible);
System.out.println(s);
// 这个输出没问题: {"id1":"-9223370018640066466","id2":"9223370018640066466","id3":100,"id4":"5404232244754964480"}
MyObj obj = new MyObj();
obj.setVal(new BigDecimal("5404232244754964480"));
String ss = JSON.toJSONString(obj, SerializerFeature.BrowserCompatible);
System.out.println(ss);
// 输出 {"val":5404232244754964480},应为:{"val":"5404232244754964480"}
}
@Data
public static class MyObj {
private BigDecimal val;
}
}