我的bean看起来像这样:
class MyBean {
private @JsonUnwrapped HashMap<String, String> map = new HashMap<String, String>();
private String name;
public HashMap<String, String> getMap() {
return map;
}
public void setMap(HashMap<String, String> map) {
this.map = map;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我正在使用以下代码序列化bean:
MyBean bean = new MyBean();
HashMap<String, String> map = new HashMap<String, String>();;
map.put("key1", "value1");
map.put("key2", "value2");
bean.setMap(map);
bean.setName("suren");
ObjectMapper mapper = new ObjectMapper();
System.out.println("\n"+mapper.writeValueAsString(bean));
我得到的结果如下:
{"map":{"key2":"value2","key1":"value1"},"name":"suren"}
但
{"key2":"value2","key1":"value1","name":"suren"}
预计每JacksonFeatureUnwrapping documentation 。为什么我没有得到解开的结果?
答案 0 :(得分:76)
@JsonUnwrapped
不适用于地图,仅适用于带有getter和setter的正确POJO。对于地图,您应该使用@JsonAnyGetter
和@JsonAnySetter
(以jackson版本&gt; = 1.6提供)。
在你的情况下,试试这个:
@JsonAnySetter
public void add(String key, String value) {
map.put(key, value);
}
@JsonAnyGetter
public Map<String,String> getMap() {
return map;
}
这样,您也可以直接向地图添加属性,例如add('abc','xyz')
会将新密钥abc
添加到值为xyz
的地图中。
答案 1 :(得分:7)
杰克逊项目目前有一个an open issue,可以在地图上支持@JsonUnwrapped
。它在即将发布的2.9版本中列为change likely to be postponed,所以看起来很可能在版本2.10之前不会包含它。
在此之前,有关使用another answer中提出的@JsonAnySetter
/ @JsonAnyGetter
的解决方法似乎是可行的方法。