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<TMacntFeeResp> 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);
    }

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

首先分析:
List<TMchntDAILYailyCountEntity> 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<TMchntDAILYailyCountEntity> 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}]

修复前有精度损失:

修复后:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字正腔圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值