0

我有一个对象,其中包含一个映射,其中映射中的每个值都是另一个对象,它由一些原语和一个列表组成,如下所示:

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)列表,它没有显示,所以我的感觉更加强烈......

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

4

2 回答 2

0

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

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

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

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

您在 JSON 中拥有的是:Map<String, B> mapOfBs

编辑以从下面的评论中添加:以这种方式序列化您的原因Map是 Gson 中用于 a 中的键的默认序列化方法Map是调用toString()该键。您的 POJO 不会覆盖toString(),因此您将获得Object.toString()输出。

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

于 2013-01-15T14:20:59.543 回答
0

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

你可以试试

Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
String jsonString = gson.toJson(object));
于 2013-08-16T08:33:19.647 回答