【问题标题】:Using Jackson to deserialize into a Map使用 Jackson 反序列化为 Map
【发布时间】:2013-12-05 00:33:15
【问题描述】:

我有一个 JSON 对象,它有两个属性:“key”是一个字符串,“value”可以反序列化为 Java bean。

{ "key": "foo", "value": "bar" }

问题是,给定这些对象的列表,我可以将其反序列化为 Map 吗?

[{"key": "foo1", "value": "bar1"}, {"key": "foo2", "value": "bar2"}] -> Map<String, String>

目前使用 Jackson-databind 2.1

【问题讨论】:

  • 请完整解决您的问题。问题出在哪里。看不到你在做什么。
  • 基本上,您希望将数据的属性列表/XML 排列转换为删除“键”和“值”术语的更简单的形式,这样您就会得到{"foo1" : "bar1", "foo2" : "bar2", ...}。这可以通过外部数组的简单循环来完成,但是我(在 Objective-C 中)看到了其他“聪明”(尽管不一定更清洁或更有效)的方法来做到这一点。除非你是为了精神刺激,否则我建议使用简单的循环。 (如果不明显,请使用 Jackson 或其他工具转换为地图列表,然后遍历列表以构建新地图。)

标签: java json jackson


【解决方案1】:

由于您的结构不匹配,您有两个基本选择:

  1. 使用两阶段处理:使用 Jackson 绑定到匹配的中间表示(可以是 JsonNodeList&lt;Map&lt;String,Object&gt;&gt;),然后使用简单的代码转换为所需的类型
  2. 编写自定义序列化器和/或反序列化器

Jackson 不支持广泛的结构转换(有一些简单的,比如@JsonUnwrapped),所以这种功能不太可能添加到数据绑定模块中。虽然它可以作为扩展模块添加,但如果这些“智能地图”类型的结构是常用的(不幸的是,它们似乎是)。

【讨论】:

    【解决方案2】:

    您可以轻松地将上面的 JSON 转换为 List&lt;Map&lt;String, String&gt;&gt;:

    import java.util.List;
    import java.util.Map;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.type.CollectionType;
    
    public class JacksonProgram {
    
        public static void main(String[] args) throws Exception {
            ObjectMapper mapper = new ObjectMapper();
            CollectionType mapCollectionType = mapper.getTypeFactory().constructCollectionType(List.class, Map.class);
            List<Map<String, String>> result = mapper.readValue(json, mapCollectionType);
            System.out.println(result);
        }
    }
    

    上面的程序打印:

    [{key=foo1, value=bar1}, {key=foo2, value=bar2}]
    

    【讨论】:

    • 这不是他想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2017-03-02
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多