Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用jackson在java中展开和序列化java映射?_Java_Json_Jackson - Fatal编程技术网

如何使用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());