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

jgm*_*jgm 5 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());
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Class of deser's nested object is LinkedHashMap
Run Code Online (Sandbox Code Playgroud)

但是我想将嵌套映射反序列化为输出TreeMap而不是LinkedHashMap输出.我如何告诉杰克逊TreeMap在反序列化时默认使用?

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

这是使用Jackson 2.4.2,虽然如果有一种方法可以做到这一点,需要更高的版本,我将能够升级.

Sta*_*Man 2

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

Map然而,我认为 2.5 中确实对此部分进行了修复,所以一旦您添加了从到 的抽象映射,我会专门检查 2.5.0 是否可以工作TreeMap。如果这不起作用,请在https://github.com/FasterXML/jackson-databind/issues上提交错误,因为它应该可以工作。