我在测试的过程中发现,如果用WriteBigDecimalAsPlain直接返回一个BigDecimal的对象是OK的,如果将BigDecimal类型作为一个对象的属性返回,就会有科学计数的情况发生。
Q
                        
                    
                    
                    [alibaba/fastjson]WriteBigDecimalAsPlain如果将BigDecimal类型作为一个类的属性返回就不行?
6
                            A
                        
                    回答
                                4
                                
                            
                            目前有什么解决方案吗?
                                3
                                
                            
                            same question
{ msg: "success", code: 0, data: { bigDecimalFloatStr: "1.23E-17", bigDecimalStr: "100000000000000000123", bigIntegerStr: "99999999999999999999999999", longStr: "9223372036854775807" } }
不知道为何使用
修复Long的的边界精度问题时,没有顺便修复一下BigDecimal的。
虽然可以自己写序列化咯
                                2
                                
                            
                            同问
                                1
                                
                            
                            解决方案: 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"
}
}
                                5
                                
                            
                            这个问题在最新版的 1.2.72 中还是存在!
WriteBigDecimalAsPlain直接返回一个BigDecimal的对象是OK的,如果将BigDecimal类型作为一个对象的属性返回,就会有科学计数的情况发生!
请问这个bug大概何时可以修复一下,总是自己去写一个 Serialize 也不太合适
                                2
                                
                            
                            @gooking 能提供 testcase 么
                                2
                                
                            
                            @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;
    }
}