如何让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
相关产品推荐
相关产品推荐

