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
相关产品推荐
相关产品推荐

