如何使用jackson在java中解开和序列化java映射?

2022-09-03 02:09:43

我有一个这样的豆子

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

class Data {
    private fieldOne;
    private fieldTwo;
}

我想像这样序列化为Json

{
    "key1": {
        "fieldOne": "some value",
        "fieldTwo": "some value"
    },
    "key2": {
        "fieldOne": "some other value",
        "fieldTwo": "some other value"
    },
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
}

但我得到的结果像

{
    "dataMap": {
        "key1": {
            "fieldOne": "some value",
            "fieldTwo": "some value"
        },
        "key2": {
            "fieldOne": "some other value",
            "fieldTwo": "some other value"
        }
    },
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
}

如何忽略上面json中的数据映射层?我正在使用java jackson库来实现这一点。

我尝试的代码是

ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(myFOOObject)

答案 1

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

mapper.writeValueAsString(myFOOObject.getDataMap());

另一种方法是使用注释。此注释在 Jackson 1.9+ 中可用。@JsonUnwrapped

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

使用此注记的缺点是无法使用地图,如回答您的其他问题所述


答案 2

我找到了答案 - 使用@JsonAnyGetter注释和getter for map。为避免在反序列化过程中发生冲突,应使用此映射的 setter @JsonAnySetter注记。