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

时间:2013-08-04 13:43:05

标签: java json jackson

我的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

。为什么我没有得到解开的结果?

2 个答案:

答案 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的解决方法似乎是可行的方法。