我有一个非常简单的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,虽然如果有办法这样做需要更高版本我可以升级。
答案 0 :(得分:2)
模块addAbstractTypeMapping()
确实是实现映射的方法。但问题可能是由于反序列化的递归性质;因为内部值被认为是java.lang.Object
类型。
但是,我认为在2.5版本中确实存在对此部分的修复,因此,一旦您将Map
的抽象映射添加到TreeMap
,我将专门检查2.5.0是否可行。
如果这不起作用,请在https://github.com/FasterXML/jackson-databind/issues提交错误,因为它应该有效。