【问题标题】:How to change Jackson's default concrete map type?如何更改杰克逊的默认具体地图类型?
【发布时间】:2015-02-06 21:25:35
【问题描述】:

我有一个非常简单的 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,但如果有办法做到这一点,需要更高版本,我可以升级。

【问题讨论】:

    标签: java jackson


    【解决方案1】:

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

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

    【讨论】:

    • 用 2.5.0 尝试过,结果相同;按要求发布的错误。
    • 谢谢。我希望它很容易修复,因为它应该按照您使用它的方式工作。
    • FWIW,这 -- github.com/FasterXML/jackson-databind/issues/700 -- 是问题所在,它将在 Jackson 2.6 中修复(很难向后移植,因为对于 java.lang.Object 的情况,问题非常严重,又名“未键入”映射)
    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2018-01-28
    • 2018-05-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2014-05-19
    相关资源
    最近更新 更多