Java 使用Gson解析json webservice响应(应为BEGIN\u对象,但为BEGIN\u数组)

Java 使用Gson解析json webservice响应(应为BEGIN\u对象,但为BEGIN\u数组),java,android,json,web-services,gson,Java,Android,Json,Web Services,Gson,我正在尝试解析spotify web服务响应,以获取艺术家的曲目,如下所示: { "info": { "num_results": 2974, "limit": 100, "offset": 0, "query": "foo", "type": "track", "page": 1 }, "tracks": [ { "album": { "released": "2009",

我正在尝试解析spotify web服务响应,以获取艺术家的曲目,如下所示:

{
"info": {
    "num_results": 2974,
    "limit": 100,
    "offset": 0,
    "query": "foo",
    "type": "track",
    "page": 1
},
"tracks": [
    {
        "album": {
            "released": "2009",
            "href": "spotify:album:1zCNrbPpz5OLSr6mSpPdKm",
            "name": "Greatest Hits",
            "availability": {
                "territories": "AD AR AT AU BE BG BO BR CA CH CL CO CR CY CZ DE DK DO EC EE ES FI FR GB GR GT HK HN HU IE IS IT LI LT LU LV MC MT MX MY NI NL NO NZ PA PE PH PL PT PY RO SE SG SI SK SV TR TW US UY"
            }
        },
        "name": "Everlong",
        "popularity": "0.79",
        "external-ids": [
            {
                "type": "isrc",
                "id": "USRW29600011"
            }
        ],
        "length": 249.986,
        "href": "spotify:track:07q6QTQXyPRCf7GbLakRPr",
        "artists": [
            {
                "href": "spotify:artist:7jy3rLJdDQY21OgRLCZ9sD",
                "name": "Foo Fighters"
            }
        ],
        "track-number": "3"
    }]
}
我正在使用Gson库来做这件事。到目前为止,我已经在java代码中尝试过这一点:

JsonParser parser = new JsonParser();
JsonObject jObject = parser.parse(jsonString).getAsJsonObject();
JsonArray jArray = jObject.get("tracks") .getAsJsonArray();


Gson gson = new Gson();
List<Track> trackArr = new ArrayList<Track>();

Type collectiontype = new TypeToken<Collection<Track>>(){}.getType();
Collection<Track> trackColl = gson.fromJson(jArray.toString(), collectiontype);
但是我得到了一个错误:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:应该是BEGIN\u对象,但却是BEGIN\u数组

我不明白,如果我在尝试获取tracks对象(json字符串中的tracks对象是一个数组[]),那么在执行getAsJsonArray时为什么需要begin对象

“轨迹”列表是我在循环中执行此操作以将所有轨迹放入一个数组时显示的:

for (JsonElement jsonElement : jArray) {
  Type collectiontype = new TypeToken<Collection<Track>>(){}.getType();
  Collection<Track> trackCol = gson.fromJson(jsonElement, collectiontype);
  trackArr.add((Track) trackCol);

}
我做错了什么?
我感谢任何指导

您不必使用额外的库来解析JSON文件。还可以使用它以人类可读的方式读取JSON文件

使用本机版本作为以下示例:

进口:

import org.json.JSONArray;
import org.json.JSONObject;
解析代码为:

JSONObject fileJSONObject = new JSONObject(response);

JSONObject infoJSONObject = fileJSONObject.getJSONObject("info");
JSONArray tracksJSONArray = fileJSONObject.getJSONArray("tracks");

//Parsing the info
String trackType = infoJSONObject.getString("type");
String trackLimit = infoJSONObject.getString("limit");
//The rest of attributes


//Parsing the track list
JSONObject object;
for(int i=0;i<tracksJSONArray.length();i++){
    object = tracksJSONArray.getJSONObject(i);
    String trackName = object.getString("name");
    //The rest of attributes

}
我建议您创建一个包含所有必需属性及其setter和getter的track类,并在每个track的解析结束时创建一个新的track


我希望它能帮助你解决这个问题。例如,你可以做到

private static List<Object> SpotifyTest()
{
    InformationHandler informationHandler   = null;
    Injector injector                       = Guice.createInjector(new Module());
    informationHandler                      = injector.getInstance(SpotifyService.class);
    informationHandler.executeWithValue("la bamba");
    return informationHandler.getDataModel();
}
您还可以在github上查看代码

public enum SpotifyKey
{
    ALBUM_RELEASED,
    ALBUM_HREF,
    ALBUM_NAME,
    ALBUM_AVAILABILITY,
    NAME,
    POPULARITY,
    LENGTH,
    HREF,
    ARTIST_HREF,
    ARTIST_NAME,
    TRACK_NUMBER,
    ID
}