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

Java 如何使用GSON解码字符串对列表?,java,web-services,json,gson,Java,Web Services,Json,Gson,我有一个从web请求返回的类别列表,是JSON格式的。例如: "categories":[["Descriptive Cat 1 Name","cat1label"]] 在对象中如何表示?我目前有一个名为Category的对象,使用它的方式如下: private List<Category> categories; 当尝试使用GSON解码时,我得到以下eror: 01-27 21:44:46.149:错误/AndroidRuntime(843):com.google.gson.J

我有一个从web请求返回的类别列表,是JSON格式的。例如:

"categories":[["Descriptive Cat 1 Name","cat1label"]]
在对象中如何表示?我目前有一个名为Category的对象,使用它的方式如下:

private List<Category> categories;
当尝试使用GSON解码时,我得到以下eror:

01-27 21:44:46.149:错误/AndroidRuntime(843):com.google.gson.JsonParseException:应为数组,但找到了对象:Category@437d1ff8

有什么建议吗?我也可以让它们作为映射返回,尽管JSON结果中的K,V不是K,而是V,K,可以这样映射吗

如果将类别对象全部丢弃,并将其映射为:

private List<List<String,String>> categories;
私有列表类别;
但是有没有更好的方法来表示这些数据呢


Nick

我不熟悉GSON,但我不确定应用程序如何将字符串映射到对象中的字段。您似乎希望JSON结构更像:

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

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

正如@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<Map<String, List<Category>>>() {}.getType();
    Map<String, List<Category>> l = gson.fromJson(categories, type);
    System.out.println("l: " + l);
String categories=“{\'categories\”:[{\'descrName\':\'cat1label\',{\'descrName\':\'cat2label\',\'label\':\'cat2label\'}];
Gson Gson=新的Gson();
Type Type=new-TypeToken(){}.getType();
Map l=gson.fromJson(类别、类型);
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>]}
公共类类别{
私有字符串descrName;
私有字符串标签;
//不需要干净利落的人。反思,宝贝!:)
@凌驾
公共字符串toString(){
返回“”;
}
}
输出将如下所示

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>]}
l:{Categories=[,]}

感谢各位的支持。不幸的是,这是我正在使用的一个公共web服务(Yelpv2API),我无法更改它们返回的数据的格式。这是我目前一直坚持的,效果很好:

private List<List<String>> categories;
私有列表类别;

与其他人的想法相反,这不是无效的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=“{\'类别\”:[[\'描述性类别1名称\',\'cat1label\']}”;
Map Map=new Gson().fromJson(json,new TypeToken(){}.getType());
// ...

String json=“{\'类别\”:[[\'描述性类别1名称\',\'cat1label\']}”;
Map Map=new Gson().fromJson(json,new TypeToken(){}.getType());
// ...

我无法更改返回的内容,这是Yelp服务返回的数据。现在,只需将其映射为
私有列表类别
,工作正常。这不是无效的JSON。它只是一个二维数组。我不是说它无效,我只是说它不能自动映射回Java对象。List只有一个类型参数,而不是两个。这不会编译。是打字错误,我编辑了我的回复。应已阅读私人名单类别;