如何使用杰克逊API的canDeserialize ObjectMapper类方法?

cfl*_*s29 0 java json jackson

我想使用canDeserialize方法,因为在反序列化时,我想获取要在自定义反序列化中应用的类型类,如以下示例所示:

    public T deserialize(byte[] bytes) throws SerializationException {
       bolean isAccount = this.objectMapper.canDeserialize(??????).
           T t = null;

          if(isAccount)
            t = (T)this.objectMapper.readValue(bytes,Account.class);

          else 
            t = (T) this.objectMapper.readValue(bytes, 0, bytes.length, new TypeReference<Object>(){});

         return t;
    }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Account类具有@JsonDeserialize注释,用于自定义反序列化。

Per*_*ion 5

要直接回答您的问题,这是您使用canDeserialize方法的方式:

final ObjectMapper mapper = new ObjectMapper();
mapper.canDeserialize(mapper.constructType(Bean.class));
Run Code Online (Sandbox Code Playgroud)

Bean您要检查的Java类的名称在哪里。

但是,等等,您正在尝试解决错误的问题。您正在为方法的逻辑而苦苦挣扎,因为它的设计不正确。通过尝试使它们推断有关要实例化的类型的所有必需信息(基于参数化的返回值),您确实对Java运行时(和Jackson库)有太多的要求。为了解决这个问题,您应该包含表示要反序列化的类型的类,作为该方法的参数,从而大大简化了逻辑:

public <T> T deserialize(byte[] bytes, Class<T> clazz) throws IOException,
      JsonProcessingException {
   return new ObjectMapper().readValue(bytes, clazz);
}
Run Code Online (Sandbox Code Playgroud)

至此,您可能已经意识到,上面的方法除了ObjectMapper.readValue直接调用之外,没有提供其他功能,所以…… 就这样做吧!无需定义自定义方法,只需使用ObjectMapper就可以了。请记住,您无需执行任何显式操作即可触发类的自定义反序列化。Jackson运行时会自动检测类何时具有自定义反序列化器并对其进行调用。