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

Jackson自定义反序列化器:定位JSON路径后如何正常反序列化?

解决方案

要实现定位到指定JSON路径后完成反序列化,你可以利用Jackson的DeserializationContext或当前JsonParser的ObjectCodec来处理目标节点,避免创建新的ObjectMapper导致循环调用问题。

方法一:使用DeserializationContext的readValue方法

直接通过上下文对象反序列化目标节点,它会复用当前的配置,不会触发递归调用:

class BugDeserializer : JsonDeserializer<Bug>() {
    override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): Bug {
        val node: TreeNode = p!!.readValueAsTree()
        val correctNode = node.at("/items/0")
        
        // 利用上下文直接反序列化目标节点
        return ctxt!!.readValue(correctNode, Bug::class.java)
    }
}

方法二:使用JsonParser的ObjectCodec

通过当前解析器的codec属性获取序列化工具,同样能复用现有配置:

class BugDeserializer : JsonDeserializer<Bug>() {
    override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): Bug {
        val node: TreeNode = p!!.readValueAsTree()
        val correctNode = node.at("/items/0")
        
        // 使用当前解析器的ObjectCodec反序列化
        return p.codec.readValue(correctNode, Bug::class.java)
    }
}

关键说明

  • 不要实例化新的ObjectMapper:因为Bug类标注了自定义反序列化器,新的ObjectMapper会自动应用该注解,导致反序列化时递归调用当前类,最终引发栈溢出。
  • 上述两种方法都复用了当前反序列化流程中的配置和上下文,只会对/items/0路径下的节点进行反序列化,不会触发外层的反序列化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:50:31