[英]Using Jackson to deserialize into a Map
我有一个 JSON object 有两个属性:“key”是一个字符串,“value”可以反序列化为一个 Java bean。
{ "key": "foo", "value": "bar" }
问题是,给定这些对象的列表,我可以将其反序列化为 Map 吗?
[{"key": "foo1", "value": "bar1"}, {"key": "foo2", "value": "bar2"}] -> Map<String, String>
目前使用 Jackson-databind 2.1
您可以轻松地将上述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}]
由于您的结构不匹配,因此有两个基本选项:
JsonNode
或List<Map<String,Object>>
),然后使用简单的代码转换为所需的类型 Jackson不支持广泛的结构转换(有一些简单的转换,例如@JsonUnwrapped
),因此这种功能不太可能添加到databind模块中。 尽管可以将其添加为扩展模块,但是如果通常使用这些“智能地图”类型的结构(不幸的是,它们似乎是)。
有同样的问题,很惊讶 Jackson 无法本地处理它。 我采用的解决方案是在我试图编组的 object 上创建一个自定义设置器:
public class somePojo {
private Map<String, String> mapStuff;
...
public void SetMapStuff(List<Map<String, String> fromJackson){
mapStuff= new HashMap<>();
for (Map<String, String> pair : fromJackson) {
put(pair.get("key"), pair.get("value"));
}
}
}
Jackson 足够聪明,可以找到该 setter 并愉快地将其传递给 List。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.