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

Sur*_*aju 41 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我使用以下代码序列化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));
Run Code Online (Sandbox Code Playgroud)

我得到的结果如下:

{"map":{"key2":"value2","key1":"value1"},"name":"suren"}
Run Code Online (Sandbox Code Playgroud)

{"key2":"value2","key1":"value1","name":"suren"}
Run Code Online (Sandbox Code Playgroud)

根据JacksonFeatureUnwrapping文档预计.为什么我没有得到解开的结果?

Har*_*non 85

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

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

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

@JsonAnyGetter
public Map<String,String> getMap() {
    return map;
}
Run Code Online (Sandbox Code Playgroud)

这样,您还可以直接向地图添加属性,就像add('abc','xyz')将新abc值添加到地图中一样xyz.

  • 将 \@JsonIgnore 添加到标记为 \@JsonAnyGetter 的同一方法似乎没有必要。 (4认同)

M. *_*tin 12

目前在Jackson项目中存在一个未解决的问题,以允许@JsonUnwrapped在Maps上获得支持。它没有被标记为即将发布的2.10或3.x版本的Jackson中,因此它看起来不像是在近期功能路线图上。

在支持此功能之前,使用@JsonAnySetter/ @JsonAnyGetter另一个答案中建议的解决方法似乎是解决之道。