57

我的豆子看起来像这样:

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 文档。为什么我没有得到展开的结果?

4

2 回答 2

110

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

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

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

@JsonAnyGetter
public Map<String,String> getMap() {
    return map;
}

这样,您也可以直接向地图添加属性,例如使用 value 向地图add('abc','xyz')添加新键。abcxyz

于 2013-08-04T14:06:42.793 回答
24

Jackson 项目中有一个未解决的问题,允许@JsonUnwrapped在地图上提供支持。

在支持此功能之前,在另一个答案@JsonAnySetter中使用/@JsonAnyGetter提出的解决方法似乎是可行的方法,实际上是杰克逊项目作者在公开问题中建议的方法:

按照这个:

http://www.cowtowncoder.com/blog/archives/2011/07/entry_458.html

可以使用@JsonAnyGetter/setter 做一些可能类似的事情。一个缺失的部分是目前必须有 getter(不能在 Map 文件中使用它),但这应该很容易解决。

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

@JsonAnyGetter
public Map<String,String> getMap() {
    return map;
}
于 2017-01-24T16:54:50.807 回答