2015-02-06 56 views
3

我有一个很简单的杰克逊代码反序列化嵌套JSON对象:如何更改Jackson的默认混凝土地图类型?

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每一个超类和实例,似乎没有任何工作最接近。

这是使用杰克逊2.4.2,但如果有办法做到这一点,需要更高的版本,我将能够升级。

回答

0

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

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

+0

用2.5.0试过,结果相同;根据要求发布错误。 – jgm 2015-02-07 08:34:41

+0

谢谢。我希望事情变得容易解决,因为这是应该以您使用它的方式工作的。 – StaxMan 2015-02-09 22:06:23

+0

FWIW,这个 - https://github.com/FasterXML/jackson-databind/issues/700 - 是问题所在,它将在Jackson 2.6中修复(难以回溯,因为问题对于' java.lang.Object',又名“untyped”映射) – StaxMan 2015-02-13 19:40:48