如何使用jackson在java中展开和序列化java映射?
我有一颗这样的豆子如何使用jackson在java中展开和序列化java映射?,java,json,jackson,Java,Json,Jackson,我有一颗这样的豆子 class Foo { private Map<String, Data> dataMap; private String fooFieldOne; private String fooFieldTwo; } class Data { private fieldOne; private fieldTwo; } { "key1": { "fieldOne": "some value",
class Foo {
private Map<String, Data> dataMap;
private String fooFieldOne;
private String fooFieldTwo;
}
class Data {
private fieldOne;
private fieldTwo;
}
{
"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层?我正在使用javajackson库来实现这一点
我试过的代码是
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(myFOOObject)
你越来越
{ "dataMap": ... }
因为Foo
中有一个名为dataMap
的字段。这里不能忽略字段的名称,因为如果Foo
有多个映射,它将创建冲突,例如
class Foo {
private Map<String, Data> dataMap1;
private Map<String, Data> dataMap2;
}
现在,在反序列化时,使用字段名使其变得非常清晰
{
"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中的数据映射层
您只需序列化映射即可
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(myFOOObject.getDataMap());
在地图中有两个对象
String
和Data
。JSON将java对象转换为JSON键值对,但如果已经有一个包含键值对的映射,并将该映射转换为JSON文档,那么Map key也将转换为JSON键值对,Map value也将有一个转换为键值对的对象 您可以为dataMap创建一个getter并序列化dataMap,而不是整个Foo
实例
mapper.writeValueAsString(myFOOObject.getDataMap());
另一种方法是使用@JsonUnwrapped
注释。此注释在Jackson 1.9+中提供
使用此注释的缺点是无法使用“我找到答案”中所述的映射-使用@JsonAnyGetter注释和getter for map。为了避免反序列化过程中的冲突,应使用@JsonAnySetter annotation with setter来完成此映射。非常感谢您的详细回答。我能理解我的情况。但我的bean中还有其他字段。考虑FoO有其他字段FiFeleldoFuffeld2连同我的地图。我想将所有内容序列化为单个对象,如{“key1”:{“fieldOne”:“some value”,“fieldTwo”:“some value”},“key2”:{“fieldOne”:“some other value”,“fieldTwo”:“some other value”},“fooFieldOne”:“valueone”,“fooFieldTwo”:“valuetwo”}。我如何处理这个问题?我认为这是不可能的,因为地图字段总是有一些名称(我们不能有未命名的字段),它肯定会被捕获到JSON@sanbhat可以使用
@JsonUnwrapped
。嗨,巴特,非常感谢你的详细回答。但我的bean中还有其他字段。考虑FoO有其他字段FiFeleldoFuffeld2连同我已经拥有的地图。我想将所有内容序列化为单个对象,如{“key1”:{“fieldOne”:“some value”,“fieldTwo”:“some value”},“key2”:{“fieldOne”:“some other value”,“fieldTwo”:“some other value”},“fooFieldOne”:“valueone”,“fooFieldTwo”:“valuetwo”}。我如何处理这个问题?更新了我的答案以包含@JsonUnwrapped注释。这是正确的答案,因为@JsonUnwrapped不适用于地图。
mapper.writeValueAsString(myFOOObject.getDataMap());