开发者社区> 问答> 正文

我现在在转换为json字符串与转出出现了BigDecimal属性变为BigInteger,该怎么办

我现在在转换为json字符串与转出出现了BigDecimal属性变为BigInteger属性的问题。

背景:我做了一个对象比较的功能,旧对象与新对象为同一个类,转换为json字符串通过消息队列发送到对象比对服务,消息比对转换成JsonObject,再进行拆分变成基础对象进行比较,现在同一字段都是BigDecimal,一个前端输入,一个数据库中查询出来的数据,精度不同,数据库中查询的数据在消息服务能正常获取到类为BigDecimal,但前端传入的转为了BigInteger,想请教一下怎么不丢失类型,有尝试过SerializerFeature.WriteClassName,但消息服务中不存在父类导致转成JsonObject报错

原提问者GitHub用户littlestar2125

展开
收起
白夜行fighting 2023-04-21 10:45:50 322 0
1 条回答
写回答
取消 提交回答
  • 你可以自定义一个ObjectWriter实现,就是单独一个ObjectWriterProvider,不影响全局。比如:

    static final ObjectWriterProvider provider = new ObjectWriterProvider();
    
    @BeforeEach
    void setup() {
        provider.register(BigDecimal.class, new ObjectWriter<BigDecimal>() {
            @Override
            public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
                BigDecimal decimal = (BigDecimal) object;
                if (decimal.scale() == 0) {
                    decimal = decimal.setScale(1);
                }
                jsonWriter.writeDecimal(decimal);
            }
        });
    }
    
    @Test
    public void test() throws Exception {
        BigDecimal decimal = BigDecimal.valueOf(Long.MAX_VALUE).add(BigDecimal.ONE);
        JSONWriter.Context context = JSONFactory.createWriteContext(provider);
        String str = JSON.toJSONString(decimal, context);
        assertEquals("9223372036854775808.0", str);
        BigDecimal decimal1 = (BigDecimal) JSON.parse(str);
        assertEquals(decimal, decimal1.stripTrailingZeros());
    }
    

    原回答者GitHub用户wenshao

    2023-04-21 13:42:35
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载