如何使用GSON解码字符串对列表?

时间:2011-01-28 03:55:15

标签: java web-services json gson

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

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

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

private List<Category> categories;

Category对象类似于:

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

有什么建议吗?我也可以将这些作为地图返回,虽然不是K,而是在JSON结果中它们将是V,K,它是否可以这样映射?

如果我将所有类别对象一起抛弃,并将其映射为:

,它确实有效
private List<List<String,String>> categories;

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

尼克

4 个答案:

答案 0 :(得分:4)

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

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

现在,这可以被认为是“类别”标题的地图和类别对象列表。因此,映射它的Java对象将是Map<String, List<Category>>

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

    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>]}

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

与其他人的想法相反,这不是无效的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());
// ...

答案 3 :(得分:0)

感谢输入人员。不幸的是,这是我正在使用的公共Web服务(Yelp v2 API),我无法更改它们返回的数据的格式。这就是我现在坚持的工作正常:

private List<List<String>> categories;