处理JsonArray编解码时小数尾部零被自动移除如何解决
JSON序列化保留小数尾部零的解决方案
核心原因:JSON规范中数字类型本身不存储格式信息,默认序列化逻辑会自动移除无意义的尾部零,要保留格式可以用以下几种方案:
- 方案1:字段改为String类型存储(最稳妥,适合仅需展示无需计算的场景)
解析JSON时直接读取原始数值字符串存入TestClass对应字段,不要转成Double/BigDecimal等数值类型,序列化时会直接输出原始字符串,不会修改格式。
代码示例:// TestClass定义示例 public class TestClass { // 原数值字段改为String类型 private String price; // getter、setter省略 } // 解析逻辑修改 jsonArray.forEach(o -> { JsonObject jsonObject = new JsonObject(o.toString()); TestClass item = new TestClass(); // 直接取字符串不要转数值 item.setPrice(jsonObject.getString("price")); list.add(item); }); - 方案2:自定义序列化规则(适合需要用数值类型做计算的场景)
你代码里的Json.encode、JsonArray属于Vert.x内置JSON工具,底层基于Jackson实现,可以给对应字段加自定义序列化注解,强制按指定小数位数输出:
第一步:自定义序列化器
第二步:给import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.io.IOException; import java.math.BigDecimal; import java.text.DecimalFormat; public class DecimalKeepSerializer extends JsonSerializer<BigDecimal> { // 按需调整保留位数,要保留2位就写0.00,要保留3位就写0.000 private static final DecimalFormat format = new DecimalFormat("0.00"); @Override public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException { if (value != null) { gen.writeNumber(format.format(value)); } } }TestClass对应字段添加序列化注解
如果你用的是其他JSON库(比如Gson),也可以通过对应库的自定义TypeAdapter实现相同逻辑。public class TestClass { @JsonSerialize(using = DecimalKeepSerializer.class) private BigDecimal price; // getter、setter省略 } - 注意事项:如果处理的是金额类敏感数据,不要用Double/Float类型存储,避免精度丢失,优先用BigDecimal或者字符串存储。
内容的提问来源于stack exchange,提问作者supriya
相关产品推荐
相关产品推荐

