Jackson 2.18.0设置STRIP_TRAILING_BIGDECIMAL_ZEROES=false仍无法保留尾随零?
解决Jackson 2.18.0保留数值尾随零的问题
你的配置没生效,核心原因是你修改的是已初始化的JsonParser关联的ObjectMapper,此时解析流程已经启动,后续配置无法影响当前的解析过程。以下是正确的解决步骤:
正确配置方式
1. 先配置ObjectMapper再解析
不要从已有的JsonParser中获取ObjectMapper,而是先创建并配置好ObjectMapper,再用它来生成JsonParser或直接解析:
// 1. 创建并配置ObjectMapper ObjectMapper mapper = new ObjectMapper(); // 禁用移除BigDecimal尾随零的特性 mapper.configure(JsonNodeFeature.STRIP_TRAILING_BIGDECIMAL_ZEROES, false); // 强制将所有浮点数值解析为BigDecimal(避免自动转成Double丢失尾随零) mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS); // 2. 用配置好的mapper解析JSON // 示例1:从字符串解析 String json = "{\"num\": 123.000}"; JsonNode root = mapper.readTree(json); // 示例2:从输入流/Reader解析(如果必须用JsonParser) JsonParser jsonParser = mapper.createParser(new FileInputStream("data.json")); JsonNode rootNode = mapper.readTree(jsonParser);
2. 正确获取数值以保留尾随零
解析后获取节点值时,要使用decimalValue()方法,而不是asDouble()或asInt()——这些方法会自动转换类型,丢失尾随零信息:
BigDecimal numValue = root.get("num").decimalValue(); System.out.println(numValue); // 输出 123.000,保留尾随零
为什么原代码不生效
你原代码中从jsonParser.getCodec()拿到的ObjectMapper,是创建该JsonParser时就已经确定配置的。此时JsonParser已经基于初始配置完成了初始化,后续修改ObjectMapper的配置,无法对正在进行的解析操作生效。必须在创建JsonParser之前完成所有配置。
内容的提问来源于stack exchange,提问作者eeropu
相关产品推荐
相关产品推荐

