如何更改杰克逊的默认具体地图类型?

时间:2015-02-06 21:25:36

标签: java jackson

我有一个非常简单的Jackson代码来反序列化嵌套的JSON对象:

public class MapTest
{
  public static void main(String ... args) throws Exception
  {
    final String ser = "{\"nested\":{\"k1\":\"v1\",\"k2\":\"v2\",\"k3\":\"v3\"}}";
    final Map<String, Object> deser = new ObjectMapper().readValue(ser, new TypeReference<TreeMap<String, Object>>(){});
    System.out.println("Class of deser's nested object is " + deser.get("nested").getClass().getSimpleName());
  }
}

当我运行时,我获得以下输出:

Class of deser's nested object is LinkedHashMap

但是我想要将嵌套地图反序列化为TreeMap,而不是根据输出反序列为LinkedHashMap。在反序列化时,如何告诉Jackson默认使用TreeMap

通过文档阅读我发现的最接近的事情是能够通过模块中的addAbstractTypeMapping()为抽象类型定义具体类,但我已经尝试了LinkedHashMap中的每个超类和实例试图做到这一点似乎没有任何作用。

这是使用Jackson 2.4.2,虽然如果有办法这样做需要更高版本我可以升级。

1 个答案:

答案 0 :(得分:2)

模块addAbstractTypeMapping()确实是实现映射的方法。但问题可能是由于反序列化的递归性质;因为内部值被认为是java.lang.Object类型。

但是,我认为在2.5版本中确实存在对此部分的修复,因此,一旦您将Map的抽象映射添加到TreeMap,我将专门检查2.5.0是否可行。 如果这不起作用,请在https://github.com/FasterXML/jackson-databind/issues提交错误,因为它应该有效。