使用Jackson反序列化为Map

时间:2013-11-20 19:58:53

标签: java json jackson

我有一个带有两个属性的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

2 个答案:

答案 0 :(得分:6)

您可以轻松地将以上JSON转换为List<Map<String, String>>

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}]

答案 1 :(得分:1)

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

  1. 使用两阶段处理:使用Jackson绑定到匹配的中间表示(可以是JsonNodeList<Map<String,Object>>),然后使用简单代码转换为所需类型
  2. 编写自定义序列化程序和/或反序列化程序
  3. 杰克逊不支持广泛的结构转换(有一些简单的转换,如@JsonUnwrapped),因此这种功能不太可能添加到数据绑定模块中。虽然它可以作为扩展模块添加,但如果这些“智能地图”类型的结构是常用的(不幸的话,它们似乎是)。