You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Vert.x JsonObject中的BigDecimal按stripTrailingZeros和toPlainString格式化?

解决Vert.x JsonObject序列化BigDecimal的格式问题

方法一:手动预处理BigDecimal(简单直接)

存入JsonObject前,先调用stripTrailingZeros()和toPlainString()将BigDecimal转成目标格式的字符串,再存入:

// 处理末尾零的情况
BigDecimal bd1 = new BigDecimal("11.110").stripTrailingZeros();
JsonObject json1 = new JsonObject().put("bd", bd1.toPlainString());
System.out.println(json1.toString()); // 输出: {"bd":"11.11"}

// 处理科学计数法的情况
BigDecimal bd2 = new BigDecimal("9.9E3").stripTrailingZeros();
JsonObject json2 = new JsonObject().put("bd", bd2.toPlainString());
System.out.println(json2.toString()); // 输出: {"bd":"9900"}

注意:这种方式会将BigDecimal以字符串类型存储,若业务要求数值类型则不适用。

方法二:自定义JsonObject子类(自动处理)

扩展JsonObject类,重写put方法自动处理BigDecimal:

public class CustomJsonObject extends JsonObject {
    @Override
    public JsonObject put(String key, Object value) {
        if (value instanceof BigDecimal) {
            BigDecimal processed = ((BigDecimal) value).stripTrailingZeros();
            // 包装对象重写toString,让JsonObject序列化时输出目标格式
            value = new Object() {
                @Override
                public String toString() {
                    return processed.toPlainString();
                }
            };
        }
        return super.put(key, value);
    }
}

使用自定义类实现自动处理:

JsonObject json = new CustomJsonObject().put("bd", new BigDecimal("11.110"));
System.out.println(json.toString()); // 输出: {"bd":11.11}

JsonObject json2 = new CustomJsonObject().put("bd", new BigDecimal("9.9E3"));
System.out.println(json2.toString()); // 输出: {"bd":9900}

此方法会将BigDecimal序列化为数值类型,无需手动处理。

方法三:自定义Jackson序列化器(全局配置)

若项目使用Vert.x的Jackson集成,可配置全局序列化规则统一处理BigDecimal:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(BigDecimal.class, new JsonSerializer<BigDecimal>() {
    @Override
    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeNumber(value.stripTrailingZeros().toPlainString());
    }
});
mapper.registerModule(module);

// 用自定义mapper序列化JsonObject
JsonObject json = new JsonObject().put("bd", new BigDecimal("11.110"));
String jsonStr = mapper.writeValueAsString(json.getMap());
System.out.println(jsonStr); // 输出: {"bd":11.11}

适合需要全局统一BigDecimal序列化格式的场景。


内容的提问来源于stack exchange,提问作者Feng Yu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:33:19