我有一个包含地图的对象,其中地图中的每个值都是另一个对象,该对象由一些基元和一个列表组成,如下所示:
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)列表,它没有显示,所以我的感觉更强......
任何人都可以在这里帮忙吗? (提前谢谢)
答案 0 :(得分:0)
在您的POJO中,您声明了Map
:Map<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));