【问题标题】:Jackson failing on deserializing empty array杰克逊在反序列化空数组时失败
【发布时间】:2015-10-02 15:45:54
【问题描述】:

我已经序列化,然后尝试使用 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 函数删除行时,一切正常。

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

【问题讨论】:

  • 试一试 Object decoded = encoded != null ? mapper.readValue(encoded, Object.class); : "{}";
  • @PradeepSekar 你在说什么? readValue 抛出异常,因为它无法解码字符串“[]”

标签: java json serialization jackson deserialization


【解决方案1】:

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[] 将保留类型信息
  • 子类列表,使用class MyPojoList extends ArrayList { } -- 因为继承会保留类型信息 (“超类型令牌”)
  • 强制使用特定的根类型(参考 wiki 链接)

【讨论】:

  • 我只想将类型注释节点添加到对象 ({}) 而不是数组或列表 ([])。我也不知道我在反序列化什么类型,因为我得到的只是一个字符串。杰克逊有可能吗
  • 那么您是否有 x # 个您期望的对象类型,并且您想根据与 serialized(json) 对象一起发送的类型键进行反序列化?在您的示例中,您提到想要序列化和反序列化 ArrayList。请更新新示例
猜你喜欢
  • 2014-09-29
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多