17

我有这样的豆子

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中的dataMap层?我为此使用了 java jackson 库。

我试过的代码是

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

4 回答 4

11

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

mapper.writeValueAsString(myFOOObject.getDataMap());

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

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

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

于 2013-08-04T09:46:49.247 回答
3

我找到了答案 - 使用带有 getter 的 @JsonAnyGetter 注释作为地图。为避免反序列化期间的冲突,应将此映射的 @JsonAnySetter 注释与 setter 一起使用。

于 2017-02-22T11:31:06.690 回答
2

你得到

{ "dataMap": ... } 

因为在其中Foo有一个字段dataMap。这里字段的名称不能被忽略,因为如果有多个地图,它会产生冲突Foo,比如

class Foo {
private Map<String, Data> dataMap1;
private Map<String, Data> dataMap2;
}

现在没有 fieldName :在 JSON 中,当 JSON 获得类似 JSON 时,它不知道如何反序列化

{
    //belongs to dataMap1
    "key1": {
        "fieldOne": "some value",
        "fieldTwo": "some value"
    },
    "key2": {
        "fieldOne": "some value",
        "fieldTwo": "some value"
    },
    //belongs to dataMap2
    "key3": {
        "fieldOne": "some value",
        "fieldTwo": "some value"
    },
    "key4": {
        "fieldOne": "some other value",
        "fieldTwo": "some other value"
    }
}

现在有了 fieldName 可以在反序列化时非常清楚

{
    "dataMap1" : {
    "key1": {
        "fieldOne": "some value",
        "fieldTwo": "some value"
    },
    "key2": {
        "fieldOne": "some value",
        "fieldTwo": "some value"
    }
    },
    "dataMap2" : {
    "key3": {
        "fieldOne": "some value",
        "fieldTwo": "some value"
    },
    "key4": {
        "fieldOne": "some other value",
        "fieldTwo": "some other value"
    }
  }
}

话说回来

如何忽略 json 中的 dataMap 层?

你可以序列化地图

ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(myFOOObject.getDataMap());
于 2013-08-04T09:44:54.957 回答
0

在地图中有两个对象StringData。JSON 将 java 对象转换为 JSON 键值对,但如果您已经有一个包含键值对的 Map,并将该映射转换为 JSON 文档,则映射键也转换为 JSON 键值对,并且 Map 值也有一个对象转换成键值对。

于 2013-08-04T09:44:55.850 回答