Map GSON包含映射的自定义类

Map GSON包含映射的自定义类,map,gson,Map,Gson,我有一个对象,它包含一个映射,其中映射中的每个值都是另一个对象,它由一些基本体和一个列表组成,如下所示: Class A { String sa; Map<B, B> mapOfBs; } Class B { String sb; List<C> listOfCs; } Class C { String sc; } { "sa": "aaaa", "mapOfBs": { "k.l.z.B@405bb400": {

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

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

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

Class C {
    String sc;
}
{
"sa": "aaaa",
"mapOfBs": {
    "k.l.z.B@405bb400": {
        "sb": "bbb",
        "listOfCs": []
    },
    "k.l.z.B@405bd968": {
         "sb": "bbbb2",
        "listOfCs": []
    }
}
当我试图反序列化字符串时,这实际上会导致一个错误。我得到的异常是“
预期的BEGIN\u对象,但却是STRING
”,它指向类B的完全限定名嵌入到字符串中的位置

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


有人能帮忙吗?(提前感谢)

在您的POJO中,您已经声明了一个
映射
映射OFBS

你已经知道了。。。不是吗

"mapOfBs": {
    "k.l.z.B@405bb400": {
        "sb": "bbb",
        "listOfCs": []
    },
 ...
“k.l.z。B@405bb400“
肯定不是a
B
,而Gson会告诉您-例如,“但是是字符串”

JSON中的内容是:
Map-mapOfBs

编辑以从下面的逗号添加:您的
Map
以这种方式进行序列化的原因是Gson中
Map
中键的默认序列化方法是调用键上的
toString()
。您的POJO不会覆盖
toString()
,因此您将获得
对象.toString()
输出


JSON本身不支持您正在尝试的操作。如果您查看JSON()的规范,您会发现它由名称/值对组成,其中名称部分是字符串;左手边不能有物体

我不确定这是否仍然有用

你可以试试

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

感谢Brian,我的映射被声明为:HashMap,但gson.toJson会产生这个对象的完全限定名。所以这个错误对我来说也是显而易见的,但我的问题是-为什么gson.toJson会解析我的映射到这个意外的结果?(顺便说一句,与此同时,我只是使用了一个列表而不是地图(对于我的用例来说性能较差,但在这里处理的数字较低-不是很关键),然后在那里处理-效果很好)参见我的编辑。JSON对的左侧只能有一个字符串。非常感谢。这就解释了我的问题。