我有像这样的豆子
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)
答案 0 :(得分: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
使用此注释的缺点是无法使用answer to your other question
中所述的地图答案 1 :(得分: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());
答案 2 :(得分:1)
我找到了答案 - 使用@JsonAnyGetter注释和getter for map。为了避免在反序列化期间发生冲突,应使用@JsonAnySetter注释和此映射的setter。
答案 3 :(得分:0)
在地图中有两个对象String
和Data
。 JSON将java对象转换为JSON键值对,但如果已经有一个包含键值对的Map,并将该映射转换为JSON文档,那么map键也会转换为JSON键值对,而Map值也有一个对象转换为键值对。