2014-02-06 284 views
0

我試圖解析Spotify的web服務響應得到一個藝術家的曲目是這樣的:解析JSON的web服務響應與GSON(預期BEGIN_OBJECT但BEGIN_ARRAY)

{ 
"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_OBJECT但BEGIN_ARRAY

我不不明白爲什麼它期望開始對象,如果我正在做「getAsJsonArray()」,當試圖獲取「track」對象時,json字符串中的數組是[]。

「跟蹤」當時我在一個循環中這樣做是爲了讓所有的曲目到一個數組列表:

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

} 

什麼我doind錯在這裏? 我很欣賞任何指導。

回答

0

您不必使用額外的庫來解析JSON文件。還可以使用此link以可讀的方式讀取您的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 

} 

我建議你創建一個軌道class那包含所有必需的屬性及其settergetter,並在每個軌道解析結束時創建一個新軌道。

我希望它有幫助

-3

你可以使用我的lib來解決這個問題。例如,你可以做到這一點。

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(); 
} 

該解決方案將返回一個列表有很多的HashMap的每個關鍵是服務鍵的枚舉,該enumarator是:

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

您也可以在GitHub上查看代碼https://github.com/WeCodeMx/WCMPopularService/tree/develop

相關問題