【问题标题】:Jackson: how to deserialize nested custom maps and lists?Jackson:如何反序列化嵌套的自定义地图和列表?
【发布时间】:2017-05-20 09:22:29
【问题描述】:

我正在尝试将无类型的 JSON 文件反序列化为 Map 接口的自定义实现。
此自定义地图实现只能具有 java 简单类型(DateStringIntegerLong)和嵌套类型(嵌套地图的自定义地图实现和嵌套数组或列表的自定义列表实现)

我尝试了以下方法:

CustomMap map = mapper.readValue(myJsonFile, CustomMap.class);

我得到了预期的类型,除了嵌套映射,我得到 HashMap 类型,对于嵌套数组,我得到 ArrayList 类型。

我认为 Jackson 使用 HashMap 处理未知类型和使用 ArrayList 处理数组。

是否可以递归回退到 CustomMap 而不是 HashMap 对于未知子类型和 CustomList 对于数组?

提前致谢

【问题讨论】:

    标签: java list dictionary jackson


    【解决方案1】:

    您可以通过在映射器上创建和注册SimpleModule 来实现此目的。这将允许在您的情况下更改Map 的类型映射以及List 等其他类型。例如

    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module = new SimpleModule("CustomCollections", Version.unknownVersion());
    module.addAbstractTypeMapping(Map.class, CustomMap.class);
    module.addAbstractTypeMapping(List.class, CustomList.class);
    mapper.registerModule(module);
    

    您可能需要像这样致电readValue

    Map<String, Object> data = mapper.readValue(myJsonFile, new TypeReference<CustomMap<String, Object>>() {});
    

    请注意,这适用于 Jackson 2.6.0 及更高版本,因为之前有 bug

    此外,Jackson 默认为 LinkedHashMap 代表 Map 而不是 HashMap,以维护 JSON 文档中数据的顺序。

    【讨论】:

    • 感谢您的回答,但是我收到了 JsonMappingException: com.fasterxml.jackson.databind.JsonMappingException: Method 仅在 Map 接口需要时提供。我们不希望公开通用的 add 方法。注意:我有 2.6.2 jackson 版本
    • 最后抛出这个异常是因为在CustomList中没有正确实现public boolean add(Object value)方法。我会找到解决方法并更新此线程。
    【解决方案2】:

    Manos 提出的解决方案可行,在我的情况下,由于缺少方法的实现,我需要为 CustomList 添加自定义反序列化器。

    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module = new SimpleModule("CustomCollections", Version.unknownVersion());
    module.addAbstractTypeMapping(Map.class, CustomMap.class);
    module.addAbstractTypeMapping(List.class, CustomList.class);
    module.addDeserializer(CustomList.class, new CustomListDeserializer());
    mapper.registerModule(module);
    

    【讨论】:

      猜你喜欢
      • 2019-08-10
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2012-07-29
      相关资源
      最近更新 更多