我有一个JSON对象,它有两个属性:“key”是一个字符串,“value”可以反序列化为Java Bean。
{ "key": "foo", "value": "bar" }
问题是,给定一个这样的对象列表,我可以将其反序列化为Map吗?
[{"key": "foo1", "value": "bar1"}, {"key": "foo2", "value": "bar2"}] -> Map<String, String>
当前使用Jackson数据绑定2.1
jw5wzhpr1#
您可以轻松地将上述JSON转换为List<Map<String, String>>:
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}]
mcdcgff02#
由于您的结构不匹配,您有两个基本选项:1.使用两阶段处理:使用Jackson绑定到匹配中间表示(可能是JsonNode或List<Map<String,Object>>),然后用简单的代码转换为所需的类型1.编写自定义序列化程序和/或反序列化程序Jackson不支持广泛的结构转换(有一些简单的,比如@JsonUnwrapped),所以这种功能不太可能被添加到数据绑定模块中。虽然它可以作为扩展模块添加,如果这些“smart Map”类型的结构被常用的话(不幸的是,它们似乎是)。
JsonNode
List<Map<String,Object>>
@JsonUnwrapped
9jyewag03#
我遇到了同样的问题,并且很惊讶Jackson不能以本机方式处理它。我采用的解决方案是在我试图封送的对象上创建一个自定义setter:
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很聪明,他能找到二传手,并很高兴地把名单传给它。
3条答案
按热度按时间jw5wzhpr1#
您可以轻松地将上述JSON转换为
List<Map<String, String>>
:上述程序打印:
mcdcgff02#
由于您的结构不匹配,您有两个基本选项:
1.使用两阶段处理:使用Jackson绑定到匹配中间表示(可能是
JsonNode
或List<Map<String,Object>>
),然后用简单的代码转换为所需的类型1.编写自定义序列化程序和/或反序列化程序
Jackson不支持广泛的结构转换(有一些简单的,比如
@JsonUnwrapped
),所以这种功能不太可能被添加到数据绑定模块中。虽然它可以作为扩展模块添加,如果这些“smart Map”类型的结构被常用的话(不幸的是,它们似乎是)。9jyewag03#
我遇到了同样的问题,并且很惊讶Jackson不能以本机方式处理它。我采用的解决方案是在我试图封送的对象上创建一个自定义setter:
Jackson很聪明,他能找到二传手,并很高兴地把名单传给它。