如何使用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
如果您的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
要么
String json = "{\"categories\":[[\"Descriptive Cat 1 Name\",\"cat1label\"]]}"; Map>> map = new Gson().fromJson(json, new TypeToken
感谢输入人员。 不幸的是,这是我正在使用的公共Web服务(Yelp v2 API),我无法更改它们返回的数据的格式。 这就是我现在坚持的工作正常:
private List> categories;