杰克逊解串器优先级?

Posted

技术标签:

【中文标题】杰克逊解串器优先级?【英文标题】:Jackson deserializer priority? 【发布时间】:2019-05-25 20:39:02 【问题描述】:

我有一个 Spring Boot 应用程序,它正在对 ActityStreams 对象进行建模,并且在大多数情况下,Jackson 的多态反序列化运行良好。

JSON 中有“对象”,它们是引用(链接),而不是带有类型信息的 JSON 对象。例如 "actor":"https://some.actors.href/ 而不是

"actor":
   "type":"Actor",
   "name":"SomeActor"
 

我已经编写了自定义反序列化器并将它们放在字段中以处理此问题

@JsonDeserialize (using = ActorOrLinkDeserializer.class)
private Actor actor;

但是我的ActorOrLinkDeserializer 被实例化但从未被调用,Jackson 抱怨来自多态反序列化器的Missing type id when trying to resolve subtype of [simple type, class org.w3.activity.streams.Actor]: missing type id property 'type' (for POJO property 'actor')

看来,多态反序列化代码优先于我的本地 @JsonDeserialize 注释,我需要一种方法来强制我的代码首先运行。

我尝试使用我自己的 ObjectMapper 而不是 Boot 的,但没有任何区别。

非常感谢您的指点和建议。

【问题讨论】:

【参考方案1】:

事实证明,使用DeserializationProblemHandler 有一个相当简单的解决方案。

到目前为止,我实现的适用于所有测试用例的是

1.

objectMapper.addHandler(new DeserProblemHandler());

或register with Spring Boot.

2.

public class DeserProblemHandler extends DeserializationProblemHandler 
   public JavaType handleMissingTypeId(DeserializationContext ctxt, JavaType baseType, TypeIdResolver idResolver, String failureMsg) 
      return TypeFactory.defaultInstance().constructType(baseType.getRawClass());
   

    为每个多态类添加一个构造函数,该构造函数接受一个字符串参数,即 href。

【讨论】:

以上是关于杰克逊解串器优先级?的主要内容,如果未能解决你的问题,请参考以下文章

串行解串器 SerDes

改造 + GSON 解串器

Jackson 解串器默认是如何工作的

受 Deadbolt“限制”注释影响的 Jackson 解串器

将值注入Jackson转换器/解串器

DC平衡双向控制解串器 转接IC GM8914:FPD-LINK III转LVTTL芯片