关于fastjson序列化BigDecimal

小琪小小 发布于 2016/07/18 16:06
阅读 6K+
收藏 0

@wenshao 你好,想跟你请教个问题:项目中有用到BigDecimal,然后我想按照自己的方式序列化BigDecimal,不保留小数,但是出现了问题。代码是这样子的

这是自己定义的序列化BigDecimal类

public class BigDecimalFormatSerializer implements ObjectSerializer {
	private final DecimalFormat decimalFormat;

	public BigDecimalFormatSerializer(DecimalFormat decimalFormat) {
		this.decimalFormat = decimalFormat;
	}

	@Override
	public void write(JSONSerializer jsonSerializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        SerializeWriter out = jsonSerializer.getWriter();
        if(object == null){
            out.write("0");
        }else{
            BigDecimal bigDecimal = (BigDecimal)object;
            String value = decimalFormat.format(bigDecimal);
            out.write(value);
        }
    }
}



在另一个处理类中有设置BigDecimal处理类

//设置序列化时间 Bigdecimal忽略小数
    private static SerializeConfig config = new SerializeConfig();
    private static String dateFormat;
    private static DecimalFormat decimalFormat;

    static {
        dateFormat = "yyyy-MM-dd'T'HH🇲🇲ssXXX";
        decimalFormat = new DecimalFormat("#0");
        config.put(Date.class, new SimpleDateFormatSerializer(dateFormat));
        // 数据库类型是 java.sql.Timestamp  ,record.getDate获取的也是这个类型
        config.put(Timestamp.class, new SimpleDateFormatSerializer(dateFormat));
        config.put(BigDecimal.class,new BigDecimalFormatSerializer(decimalFormat));
    }



测试的时候发现,如果是直接序列化一个BigDecimal对象是完全没问题的,但是如果是一个Bean对象,有一个属性的类型是BigDecimal,序列化的时候完全没有走到自己定义的BigDecimal处理类当中

public static void main(String[] args) {
        BigDecimal date = new BigDecimal("124.12");
        TestVo userVO = new TestVo();
        userVO.setA(date);
        String s = JSON.toJSONString(userVO, config);
        System.out.println(s);

    }

输出 124.12



public static void main(String[] args) {
        BigDecimal date = new BigDecimal("124.12");
//        TestVo userVO = new TestVo();
//        userVO.setA(date);
        String s = JSON.toJSONString(date, config);
        System.out.println(s);

    }

输出124



请问下这个问题是什么导致的呢?(原谅我debug的眼睛都快瞎了还没发现问题)。谢谢!!


加载中
0
温安适
温安适
使用@JSONField(format="#0") 在a属性上进行注解,就能完成你的需求
小琪小小
的确可以,但是如果每一个VO对象的BigDecimal属性都这样备注的话,有点难于管理,最好的方式就是在出入口统一格式化管理。谢谢
返回顶部
顶部