GSON自定义类包含地图

时间:2013-01-15 11:04:46

标签: map gson

我有一个包含地图的对象,其中地图中的每个值都是另一个对象,该对象由一些基元和一个列表组成,如下所示:

Class A { 
    String sa;
    Map<B, B> mapOfBs;
}

Class B {
    String sb;
    List<C> listOfCs;
}

Class C {
    String sc;
}

为了便于讨论,我有一个包含一些信息的类实例(可以从下面解析的json中描述,而不是那么重要......)。 当我使用GSON序列化这个类时,它在服务器端检索如下:

{
"sa": "aaaa",
"mapOfBs": {
    "k.l.z.B@405bb400": {
        "sb": "bbb",
        "listOfCs": []
    },
    "k.l.z.B@405bd968": {
         "sb": "bbbb2",
        "listOfCs": []
    }
}

当我尝试反序列化字符串时,这实际上会导致错误。我得到的例外是“Expected BEGIN_OBJECT but was STRING”指向字符串中嵌入了B类的完全限定名称的位置。

我的感觉是B类解析出了问题,因为我不明白为什么在那里插入完全限定名。同样对于(Cs)列表,它没有显示,所以我的感觉更强......

任何人都可以在这里帮忙吗? (提前谢谢)

2 个答案:

答案 0 :(得分:0)

在您的POJO中,您声明了MapMap<B,B> mapOfBs

你有JSON ......不是那样的。

"mapOfBs": {
    "k.l.z.B@405bb400": {
        "sb": "bbb",
        "listOfCs": []
    },
 ...

"k.l.z.B@405bb400"肯定不是B,Gson告诉你 - 例如“但是是字符串”

您在JSON中的内容是:Map<String, B> mapOfBs

编辑以添加以下内容:您的Map以这种方式序列化的原因是Gson中Map中的键的默认序列化方法是调用密钥上toString()。您的POJO不会覆盖toString(),因此您将获得Object.toString()输出。

JSON本身不支持您要执行的操作。如果你看一下JSON(http://www.json.org/)的规范,你会发现它由名称/值对组成,其中名称部分是一个字符串;你不能在左手边有一个物体。

答案 1 :(得分:0)

我不确定这是否仍有帮助。

你可以尝试

Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
String jsonString = gson.toJson(object));