我已经序列化,然后尝试使用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
函数的行时,每个工作都正常。
我使用这个库是错误的还是库错误?
答案 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链接)