我有一个以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;
但是有更好的方法来表示这些数据吗?
尼克
答案 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;