如何自定义反序列化逻辑,将String转为JsonNode时将整数型Double转为IntNode
实现方案
你可以通过自定义Jackson的JsonNodeFactory来实现需求,该方案不需要绑定任何预定义POJO,对任意结构的JSON反序列化为JsonNode的场景都生效,具体实现步骤如下:
1. 自定义JsonNodeFactory
重写数值节点生成逻辑,对值为整数的浮点数自动转为整型节点:
import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.NumericNode; import java.math.BigDecimal; public class IntConvertibleJsonNodeFactory extends JsonNodeFactory { public static final IntConvertibleJsonNodeFactory INSTANCE = new IntConvertibleJsonNodeFactory(); @Override public NumericNode numberNode(double v) { // 判断double值是否为整数 if (v == Math.rint(v) && !Double.isInfinite(v)) { long longVal = (long) v; // 数值在int范围内返回IntNode,否则返回LongNode if (longVal >= Integer.MIN_VALUE && longVal <= Integer.MAX_VALUE) { return numberNode((int) longVal); } return numberNode(longVal); } return super.numberNode(v); } // 覆盖BigDecimal构造方法,兼容不同解析场景 @Override public NumericNode numberNode(BigDecimal v) { if (v.stripTrailingZeros().scale() <= 0) { try { return numberNode(v.intValueExact()); } catch (ArithmeticException e) { try { return numberNode(v.longValueExact()); } catch (ArithmeticException ex) { // 超出整型范围时保留原始数值类型 } } } return super.numberNode(v); } }
2. 配置ObjectMapper使用自定义NodeFactory
// 示例输入 String str = "{ \"a\": 1.0, \"b\": 0.5 }"; ObjectMapper objectMapper = new ObjectMapper(); // 替换默认节点工厂 objectMapper.setNodeFactory(IntConvertibleJsonNodeFactory.INSTANCE); JsonNode n = objectMapper.readTree(str);
效果验证
n.get("a").isInt()返回true,节点类型为IntNoden.get("b").isDouble()返回true,节点类型为DoubleNode,完全符合预期需求。
内容的提问来源于stack exchange,提问作者user4998087
相关产品推荐
相关产品推荐

