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“
肯定不是aB
,而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对的左侧只能有一个字符串。非常感谢。这就解释了我的问题。