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

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

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

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

 private List 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,它是否可以这样映射?

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

 private List<List> categories; 

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

缺口

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

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

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

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

  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>>() {}.getType(); Map> 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 ""; } } 

输出将显示如下

  l: {Categories=[, ]} 

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

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

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

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

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

要么

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

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

 private List> categories;