如何使用jackson在java中解包和序列化java地图?

时间:2013-08-04 09:37:19

标签: java json jackson

我有像这样的豆子

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 个答案:

答案 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)

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