杰克逊反序列化哈希映射 [英] Jackson deserializing hash map
问题描述
我有以下JSON:
"propertyName": "{"1":[{"1":"value1","2":"value2","3":false}]}"
第一个属性是具有属性映射后数组中项目的计数。
the first property being the count of items in the array following having a map of properties.
如果我想要使用Jackson
反序列化它的最佳方法是什么填写一个包含这些值的类:
What is the best way to deserialize this using Jackson if I want to fill up a class holding these values:
class MyHolder
{
name = "value1";
age = "value2";
female = false;
}
例如。
推荐答案
您的JSON无效。假设JSON看起来像这样:
Your JSON is not valid. Let assume that JSON looks like this:
{
"propertyName":{
"1":[
{
"1":"value1",
"2":"value2",
"3":false
}
]
}
}
最简单的方法是创建适合您的POJO类JSON。例如:
The simplest way is to create POJO classes which fit to your JSON. For example:
class Root {
private Map<String, List<MyHolder>> propertyName;
//getters,setters,toString
}
class MyHolder {
@JsonProperty("1")
private String name;
@JsonProperty("2")
private String age;
@JsonProperty("3")
private boolean female;
//getters,setters,toString
}
现在我们可以通过这种方式轻松反序列化:
Now we can easily deserialize it in this way:
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue("{.. json ...}", Root.class));
以上程序打印:
Root [propertyName={1=[MyHolder [name=value1, age=value2, female=false]]}]
如果我们不希望在POJO类中看到 Map
,我们必须编写自定义转换器:
If we do not want to see Map
in our POJO class we have to write custom converter:
class MapMyHolderConverter implements Converter<Map<String, List<Map<String, Object>>>, List<MyHolder>> {
@Override
public JavaType getInputType(TypeFactory typeFactory) {
return typeFactory.constructMapType(Map.class, String.class, List.class);
}
@Override
public JavaType getOutputType(TypeFactory typeFactory) {
return typeFactory.constructCollectionType(List.class, MyHolder.class);
}
@Override
public List<MyHolder> convert(Map<String, List<Map<String, Object>>> map) {
Collection<List<Map<String, Object>>> values = map.values();
if (values.isEmpty()) {
return Collections.emptyList();
}
List<MyHolder> result = new ArrayList<>();
for (Map<String, Object> item : values.iterator().next()) {
MyHolder holder = new MyHolder();
holder.setName(item.get("1").toString());
holder.setAge(item.get("2").toString());
holder.setFemale((Boolean) item.get("3"));
result.add(holder);
}
return result;
}
}
您的POJO课程现在看起来像这样:
Your POJO classes could look like this now:
class Root {
@JsonDeserialize(converter = MapMyHolderConverter.class)
private List<MyHolder> propertyName;
//getters,setters,toString
}
class MyHolder {
private String name;
private String age;
private boolean female;
//getters,setters,toString
}
As你可以在第二个例子中看到我们正在使用 @JsonDeserialize
注释,我们不能使用 @JsonProperty
。
As you can see in second example we are using @JsonDeserialize
annotation and we have not to use @JsonProperty
.
这篇关于杰克逊反序列化哈希映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!