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

如何自定义反序列化逻辑,将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,节点类型为IntNode
  • n.get("b").isDouble() 返回true,节点类型为DoubleNode,完全符合预期需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:48:04