fastJson转换BigDecimal遇到的问题

继https://blog.csdn.net/fengdijiang/article/details/100163734之后,
对全局的BigDecimal类做了String Serializer处理,精度的问题解决了,
但是遇到了Get请求应答返回json对象被String化的问题。具体问题没定位到:   记 一  个 why?

============与Jackson一样=====================
fastjson支持对单个字段设置序列化类型,但是在实际使用中出现了未知的疑问,具体移步图片示例:
@JSONField(name = "refund_fee_amt")
private BigDecimal refundFeeAmt;

@JSONField(name = "need_clear_amt", serializeUsing = ToStringSerializer.class)//应结算金额
private BigDecimal needClearAmt;

属性的get、set方法...

简单的对象转json是可行的,但是实际应用当中

List list = feeCountResp.getList();

return R.ok().put("rows", JSON.toJSON(list)).put("total", total + "");

同事是通过list包了一层后再通过JSON把变量名从驼峰转下划线输出就不行了,当然通过修改全局序列化配置类对BigDecimal的处理依然还是生效的。

    public static Object toJSON(Object javaObject) {
        return toJSON(javaObject, SerializeConfig.globalInstance);
    }

fastJson转换BigDecimal遇到的问题_第1张图片

那么问题是怎么解决的呢?

首先分析:
List list = new ArrayList();
list.add(entity);

要让list打印出来的string 我想要的(让注解生效),就必须是JSON.toJSONString(entity)的,所以重写了TMchntDAILYailyCountEntity

@Override
public String toString(){
    return JSON.toJSONString(this);
}

接下来就只要通过list产出一个object就可以了。所以就有了下面这句代码:

Object object = JSONObject.parse(list.toString());

从结果上是不是也可以反证:JSON.toJSON(list); 并没有不会让list内的对象序列化!!?

====================浅层的分析解决了问题,更深的没挖=============验证代码如下================

public  static void main(String[] args){
        TMchntDAILYailyCountEntity entity = new TMchntDAILYailyCountEntity();
        entity.setRefundFeeAmt(new BigDecimal("123.89"));
        entity.setNeedClearAmt(new BigDecimal("112.99"));
        String strEntitiy = JSON.toJSONString(entity);
        System.out.println(strEntitiy);
        System.out.println(entity.toString());
        System.out.println("--------------------");
        List list = new ArrayList();
        list.add(entity);
        System.out.println(list);
        Object o = JSON.toJSON(list);//使用了全局的序列化功能,并没有使用JSONField内配置的
        System.out.println(o);
        System.out.println("--------------------");
//        SerializeConfig serializeConfig = SerializeConfig.globalInstance;
//        serializeConfig.put(BigDecimal.class, ToStringSerializer.instance);
        Object object = JSONObject.parse(list.toString());
        //Object object = JSON.toJSON(list, serializeConfig );
        System.out.println(object);
        //System.out.println(o);
        return;
    }

============结果===============

{"need_clear_amt":"112.99","refund_fee_amt":123.89}
{"need_clear_amt":"112.99","refund_fee_amt":123.89}
--------------------
[{"need_clear_amt":"112.99","refund_fee_amt":123.89}]
[{"need_clear_amt":112.99,"refund_fee_amt":123.89}]
--------------------
[{"need_clear_amt":"112.99","refund_fee_amt":123.89}]

修复前有精度损失:

修复后:

fastJson转换BigDecimal遇到的问题_第2张图片

你可能感兴趣的:(java)