杰克逊未能反序列化空阵列

时间:2015-10-02 15:45:55

标签: java json serialization jackson deserialization

我已经序列化,然后尝试使用jacksons库反序列化空数组

ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(DefaultTyping.OBJECT_AND_NON_CONCRETE, JsonTypeInfo.As.PROPERTY);

List<Integer> original = new ArrayList<Integer>();
Writer w = new StringWriter();
mapper.writeValue(w, original);

String encoded = w.toString();
Object decoded = mapper.readValue(encoded, Object.class); // THIS LINE THROWS

但最后一行失败并出现错误:

org.codehaus.jackson.map.JsonMappingException: Unexpected token (END_ARRAY), expected VALUE_STRING: need JSON String that contains type id (for subtype of java.lang.Object)

但是当我删除enableDefaultTyping函数的行时,每个工作都正常。

我使用这个库是错误的还是库错误?

1 个答案:

答案 0 :(得分:0)

To get the generic ArrayListType:

ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, As.PROPERTY);
List<Integer> original = new ArrayList<Integer>();
String encoded = mapper.writeValueAsString(original);
Object decoded = mapper.readValue(encoded, Object.class); 
/*Results in encoded: ["java.util.ArrayList",[]] */

保留列表类型参考jackson wiki中的5.1 Missing type information on Serialization

  

有多种方法可以解决这个问题:

     
      
  • 使用数组而不是列表:MyPojo []将保留类型信息
  •   
  • 子类列表,使用类MyPojoList扩展ArrayList {} - 由于继承将保留类型信息   (“超级型令牌”)
  •   
  • 强制使用特定的根类型(参考wiki链接)
  •