【问题标题】:GSON custom class containing map包含地图的 GSON 自定义类
【发布时间】:2013-01-15 11:04:46
【问题描述】:

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

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

有人可以帮忙吗? (提前致谢)

【问题讨论】:

    标签: map gson


    【解决方案1】:

    在你的 POJO 中你声明了一个 Map: Map&lt;B,B&gt; mapOfBs

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

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

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

    您在 JSON 中的内容是:Map&lt;String, B&gt; mapOfBs

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

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

    【讨论】:

    • 谢谢布赖恩,我的地图被声明为:HashMap 但 gson.toJson 会产生这个对象的完全限定名称。所以这个错误对我来说也很明显,但我的问题是 - 为什么 gson.toJson 会将我的地图解析为这个意想不到的结果? (顺便说一句,与此同时,我只是使用了一个列表而不是地图(我的用例性能较差,但在这里处理的数字很少 - 不是那么重要),你去 - 就像一个魅力)
    • 查看我的编辑。在 JSON 对的左侧除了一个字符串之外什么都不能有。
    • 非常感谢。这解释了我的问题。
    【解决方案2】:

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

    你可以试试

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多