【问题标题】:How do I decode a list of string pairs with GSON?如何使用 GSON 解码字符串对列表?
【发布时间】:2011-01-28 03:55:15
【问题描述】:

我有一个从 Web 请求返回的 JSON 格式的类别列表。一个例子可能是:

"categories":[["Descriptive Cat 1 Name","cat1label"]]

这将如何在对象中表示?我目前有一个名为 Category 的对象,并且正在使用它:

private List<Category> categories;

类别对象看起来像:

class Category {
   private String descrName;
   private String label;
    .. getters and setters..
}

尝试使用 GSON 解码时出现此错误:

01-27 21:44:46.149: ERROR/AndroidRuntime(843): com.google.gson.JsonParseException: 期望数组但找到对象:Category@437d1ff8

有什么建议吗?我也可以让那些作为地图回来,尽管在 JSON 结果中它们将是 V,K,而不是 K,V,它可以这样映射吗?

如果我将 Category 对象全部丢弃,它确实有效,只需将其映射为:

private List<List<String,String>> categories;

但是有没有更好的方法来表示这些数据?

尼克

【问题讨论】:

  • 我无法更改返回的内容,这是 Yelp 服务返回的数据。现在只需将其映射为 private List&lt;List&lt;String,String&gt;&gt; categories 即可。

标签: java web-services json gson


【解决方案1】:

正如@Dante617 正确指出的那样,您的 JSON 表示不正确。正确的表示是

{
    "categories": [
                   {"descrName":"Descriptive Cat Name 1", "label": "cat1Label"},
                   {"descrName":"Descriptive Cat Name 2", "label": "cat2Label"}
                  ]
}

现在,可以将其视为“类别”标题和类别对象列表的映射。因此,映射它的 Java 对象将是 Map&lt;String, List&lt;Category&gt;&gt;

如果你以某种方式正确地重新格式化你的字符串,就像上面的那样。以下是您将如何解析。

    String categories = "{\"Categories\":[{\"descrName\":\"Descriptive Cat 1 Name\",\"label\":\"cat1label\"}, {\"descrName\":\"Descriptive Cat 2 Name\",\"label\":\"cat2label\"}]}";
    Gson gson = new Gson();
    Type type = new TypeToken<Map<String, List<Category>>>() {}.getType();
    Map<String, List<Category>> l = gson.fromJson(categories, type);
    System.out.println("l: " + l);

如果你的 Java 对象看起来像这样

public class Category {
    private String descrName;
    private String label;
    //no need of getters and setters. Reflection, baby! :)

    @Override
    public String toString() {
        return "<Name:"+descrName+", label:"+label+">";
    }
}

输出会这样显示

 l: {Categories=[<Name:Descriptive Cat 1 Name, label:cat1label>, <Name:Descriptive Cat 2 Name, label:cat2label>]}

【讨论】:

    【解决方案2】:

    我不熟悉 GSON,但我不确定应用程序如何将字符串映射到对象中的字段。看起来你想要一个更像的 JSON 结构:

    "categories": [
                   {"descrName":"Descriptive Cat Name 1", "label": "cat1Label"},
                   {"descrName":"Descriptive Cat Name 2", "label": "cat2Label"}
                  ]
    

    这可能有助于动态创建 Java 对象。

    【讨论】:

    • 那不是无效的 JSON。它只是一个二维数组。
    • 我并不是说它是无效的,我只是说它不能自动映射回 Java 对象。
    【解决方案3】:

    与其他人的想法相反,这不是无效的 JSON。 [[]] 只是一个二维数组。在 Java 术语中,它映射如下:

    String json = "{\"categories\":[[\"Descriptive Cat 1 Name\",\"cat1label\"]]}";
    Map<String, String[][]> map = new Gson().fromJson(json, new TypeToken<Map<String, String[][]>>(){}.getType());
    // ...
    

    String json = "{\"categories\":[[\"Descriptive Cat 1 Name\",\"cat1label\"]]}";
    Map<String, List<List<String>>> map = new Gson().fromJson(json, new TypeToken<Map<String, List<List<String>>>>(){}.getType());
    // ...
    

    【讨论】:

      【解决方案4】:

      感谢各位提供意见。不幸的是,这是我正在使用的公共 Web 服务(Yelp v2 API),我无法更改它们返回的数据格式。这是我现在坚持的,效果很好:

      private List<List<String>> categories;
      

      【讨论】:

      • List 只有一个类型参数,不是两个。这不会编译。
      • 是一个错字,我编辑了我的回复。应该读过私有 List> 类别;
      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多