为什么我无法使用Jackson Java库解包和序列化Java映射?

我的bean看起来像这样:

class MyBean { private @JsonUnwrapped HashMap map = new HashMap(); private String name; public HashMap getMap() { return map; } public void setMap(HashMap map) { this.map = map; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 

当我使用以下代码序列化bean时:

 MyBean bean = new MyBean(); HashMap map = new HashMap();; 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文档预计。 为什么我没有得到解开的结果?

@JsonUnwrapped不适用于地图,仅适用于具有getter和setter的正确POJO。 对于地图,您应该使用@JsonAnyGetter@JsonAnySetter (在jackson版本中可用> = 1.6)。

在你的情况下,试试这个:

  @JsonAnySetter public void add(String key, String value) { map.put(key, value); } @JsonAnyGetter public Map getMap() { return map; } 

这样,您也可以直接向地图添加属性,例如add('abc','xyz')将向地图添加新的关键字abc ,其值为xyz

jackson项目目前有一个未解决的问题 ,即允许在地图上支持@JsonUnwrapped。 它列为可能会从即将发布的2.9版本中推迟的更改 ,因此看起来很可能直到版本2.10才会包含此更改 。

在那之前,关于在另一个答案中提出使用@JsonAnySetter / @JsonAnyGetter的解决方法似乎是要走的路。