如何使用方法canDeserialize来自jackson API的ObjectMapper类?

时间:2013-05-27 16:05:43

标签: 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;
    }

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

1 个答案:

答案 0 :(得分:5)

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

final ObjectMapper mapper = new ObjectMapper();
mapper.canDeserialize(mapper.constructType(Bean.class));

其中Bean是要检查的Java类的名称。

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

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

此时你可能已经意识到上面的方法没有提供额外的功能而只是直接调用ObjectMapper.readValue,所以... 只是这样做!无需定义自定义方法,只需使用ObjectMapper就可以了。请记住,您不需要执行任何明确的操作来触发类的自定义反序列化。 Jackson运行时会自动检测类何时具有自定义反序列化器并调用它。