Java中满足条件终止反序列化及关联反序列化器数据访问问题
Jackson自定义反序列化问题解答
待处理的JSON结构
{ "identifier": "Test", "persons": [ { "id": "1", "firstName": "Max", "lastName": "Test1", ... }, { "id": "2", "firstName": "Anne", "lastName": "Test1" } ... ], "relations": [ { "identifier": "1", "partnerFirst": "1", "partnerSecond": "2", "children": [ { "id": "3", "adopted": false }, { "id": "4", "adopted": false } ], ... } ] }
问题1:在Relation反序列化器中能否访问Person列表以查找引用?
可以实现,推荐两种实用方案:
- 先缓存Person列表再处理Relation:先把整个JSON读成
JsonNode,解析出persons节点转成List<Person>存入自定义辅助类,之后反序列化relations时,通过DeserializationContext的setAttribute把辅助类传入,在Relation反序列化器里用ctxt.getAttribute()取出列表做引用匹配。 - 利用Jackson上下文传递:使用
ObjectReader构建反序列化上下文,在根对象反序列化过程中先处理persons并将其存入上下文,Relation反序列化器直接从上下文获取已解析的Person列表。
问题2:若identifier满足外部条件(如数据库标记为ignore),如何终止整个文件的反序列化?
直接在反序列化初期触发终止即可:
- 在根对象的反序列化逻辑里,先读取
identifier字段,调用数据库接口校验是否标记为ignore。如果符合终止条件,直接抛出JsonProcessingException(或其子类),Jackson会立即停止整个反序列化流程,不会继续解析后续节点。 - 也可以在自定义的根对象反序列化器中,一旦检测到ignore条件,直接中断解析,无需抛出异常,但抛出标准异常更符合Jackson的处理规范,便于统一捕获处理。
问题3:目前先通过JSONParser处理后再执行反序列化,是否可向反序列化器传入辅助类?
完全可以,常用三种方式:
- 上下文属性传递:在JSONParser预处理阶段,调用
DeserializationContext.setAttribute("辅助类key", 辅助类实例),之后在自定义反序列化器中通过ctxt.getAttribute("辅助类key")取出使用。 - 依赖注入:自定义Jackson
Module,将辅助类注册为可注入对象,在反序列化器的构造方法或字段上添加@JacksonInject注解,Jackson会自动注入辅助类实例。 - 自定义ObjectMapper配置:在构造
ObjectMapper时,将辅助类绑定到配置中,但这种方式灵活性不如前两种,仅适合全局通用的辅助类。
内容的提问来源于stack exchange,提问作者VANILKA
相关产品推荐
相关产品推荐

