一尘不染

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

json

我的豆子看起来像这样:

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文档中的说明。为什么我没有得到解包结果?


阅读 197

收藏
2020-07-27

共1个答案

一尘不染

@JsonUnwrapped不适用于地图,仅适用于具有getter和setter的正确POJO。对于地图,应使用@JsonAnyGetter@JsonAnySetter(在杰克逊版本>
= 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使用value向地图添加新键xyz

2020-07-27