如何使用jackson在java中解包和序列化java地图?

Sur*_*aju 14 java json jackson

我有这样的豆子

class Foo {
    private Map<String, Data> dataMap;
    private String fooFieldOne;
    private String fooFieldTwo;
}

class Data {
    private fieldOne;
    private fieldTwo;
}
Run Code Online (Sandbox Code Playgroud)

我想像Json一样序列化

{
    "key1": {
        "fieldOne": "some value",
        "fieldTwo": "some value"
    },
    "key2": {
        "fieldOne": "some other value",
        "fieldTwo": "some other value"
    },
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
}
Run Code Online (Sandbox Code Playgroud)

但我得到的结果就像

{
    "dataMap": {
        "key1": {
            "fieldOne": "some value",
            "fieldTwo": "some value"
        },
        "key2": {
            "fieldOne": "some other value",
            "fieldTwo": "some other value"
        }
    },
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
}
Run Code Online (Sandbox Code Playgroud)

如何在上面的json中忽略dataMap图层?我正在使用java jackson库.

我试过的代码是

ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(myFOOObject)
Run Code Online (Sandbox Code Playgroud)

Bar*_*art 11

您可以为dataMap创建一个getter 并序列化dataMap而不是整个Foo实例.

mapper.writeValueAsString(myFOOObject.getDataMap());
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用@JsonUnwrapped注释.这个注释可以在Jackson 1.9+中找到.

http://jackson.codehaus.org/1.9.9/javadoc/org/codehaus/jackson/annotate/JsonUnwrapped.html

使用此注释的缺点是无法使用您的其他问题答案中所述的地图


小智 5

我找到了答案 - 使用 @JsonAnyGetter 注释和地图的 getter。为了避免反序列化期间发生冲突,应使用 @JsonAnySetter 注释和此映射的 setter。

  • 这是正确的答案,因为 @JsonUnwrapped 不适用于地图。 (3认同)