288 Star 767 Fork 286

wenshao / fastjson

 / 详情

BigDecimal转换时行为不一致

待办的
创建于  
2017-01-23 15:00

使用FASTJSON(默认特性DEFAULT_PARSER_FEATURE)转换BigDecimal类型值时, 出现了不一致的行为, 代码实现很困扰:
有小数时, 反转的类型为BigDecimal
无小数时, 反转的类型为Integer

测试代码如下(FASTJSON-1.2.24|1.2.12@JDK8)

	public void testJSON(){
		BigDecimal m = new BigDecimal("12345"), n = new BigDecimal("12345.0");
		Map<String, Object> map = Maps.newHashMap();
		map.put("m", m);
		map.put("n", n);
		JSONObject obj = JSON.parseObject(JSON.toJSONString(map));
		assertNotEquals("m is not a BigDecimal, m is an Integer", m, obj.get("m"));
		assertEquals("n is a BigDecimal", n, obj.get("n"));
	}

期待BigDecimal正转反转类型不变, 其他类型保持现有特性

  1. 可接受对所有的BigDecimal类型,序列化时默认输出至少一位小数, 与Integer区别开, 对其他类型保持不变

评论 (1)

阿亮 创建了任务
阿亮 更新了任务
阿亮 更新了任务
阿亮 更新了任务

目前只能通过继承方式对BigDecimalCodec进行了增强, 需要在调用处进行特别配置, 较为麻烦

public class CustomerBigDecimalCodec extends BigDecimalCodec{
	private static DecimalFormat format;
	public CustomerBigDecimalCodec(){
		format = new DecimalFormat();
		format.setMinimumFractionDigits(1);
		format.setMaximumFractionDigits(Integer.MAX_VALUE);
		format.setGroupingUsed(false);
		format.setParseBigDecimal(true);
	}
	@Override
	public void write(JSONSerializer serializer, Object object,
			Object fieldName, Type fieldType, int features) throws IOException {
		SerializeWriter out = serializer.out;

        if (object == null) {
        	if (((1 & SerializerFeature.WriteNullNumberAsZero.mask) == 1 //
                    || (features & SerializerFeature.WriteNullNumberAsZero.mask) == 1) 
                    && ((1 & SerializerFeature.WriteBigDecimalAsPlain.mask) == 1
                    || (features & SerializerFeature.WriteBigDecimalAsPlain.mask) == 1)) {
                    out.write(format.format(BigDecimal.ZERO));
            }else{
            	out.writeNull(SerializerFeature.WriteNullNumberAsZero);
            }
        } else {
            BigDecimal val = (BigDecimal) object;

            String outText;
            if (out.isEnabled(SerializerFeature.WriteBigDecimalAsPlain)) {
                outText = format.format(val);
            } else {
                outText = val.toString();
            }
            out.write(outText);

            if (out.isEnabled(SerializerFeature.WriteClassName) && fieldType != BigDecimal.class && val.scale() == 0) {
                out.write('.');
            }
        }
	}

}

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(1)
Java
1
https://gitee.com/wenshao/fastjson.git
git@gitee.com:wenshao/fastjson.git
wenshao
fastjson
fastjson

搜索帮助

14c37bed 8189591 565d56ea 8189591