2017-09-04 115 views
-2

使用此代碼調用steam api。解析json給了我一些問題。我設法在控制檯中打印json,訪問更多數據失敗。這裏是我的代碼:Java json異常

JSONObject json = new JSONObject(IOUtils.toString(new URL("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=XXXXXXX&steamids=XXXXXXX"), Charset.forName("UTF-8"))); 
System.out.println(json.get("response")); >>> (1) 
int out = json.getJSONObject("players").getInt("steamid"); 
System.out.println(out); 

Exception in thread "main" org.json.JSONException: JSONObject["players"] not found. 

{ 
    "response": { 
     "players": [ 
      { 
       "steamid": "XXXXX", 
       "communityvisibilitystate": 3, 
       "profilestate": 1, 
       "personaname": "XXXXX", 
       "lastlogoff": 123123, 
       "profileurl": "http://steamcommunity.com/id/XXX/", 
       "avatar": "XXXXX", 
       "avatarmedium": "XXXX", 
       "avatarfull": "XXXXX", 
       "personastate": 1, 
       "primaryclanid": "XXX", 
       "timecreated": XXX, 
       "personastateflags": 0, 
       "gameextrainfo": "Tom Clancy's Rainbow Six Siege", 
       "gameid": "359550" 
      } 
     ] 

    } 
} 
+3

玩家是JSONArray而不是JSONObject –

回答

2

你只需要瞭解的JSONObject結構和的區別JSONArray結構

的的JSONObject將以開頭「{」,並且JSONArray以開頭「[」

我剛剛注意到你的錯誤,你沒有將任何變量分配給json.get(「response」)

JSONObject json = new JSONObject(IOUtils.toString(new URL("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=XXXXXXX&steamids=XXXXXXX"), Charset.forName("UTF-8"))); 
      System.out.println(json.get("response")); 
     JSONObject playersJson=json.get("response"); 
     int out = playersJson.getJSONArray("players").getJSONObject(0).getInt("steamid"); 

因此,請嘗試更改您的代碼,如上所述。

+0

謝謝你花時間。它仍然給我一個錯誤 - 找不到JSONObject [「players」]。 – piguy

+0

您是否嘗試更改代碼?基於以上 –

+0

是的,我複製了上面的代碼,並將URL更改爲正確的一個 – piguy

1

您的問題是players不是JSONObject,這是一個JSONArray包含JSONObject秒。在這種情況下,players包含一個JSONObject,所以你需要先訪問該對象使用players[0]

int out = json.getJSONArray("players")[0].getInt("steamid"); 
+0

謝謝你花時間!它給了我一個錯誤 - 表達式的類型必須是數組類型,但它解析爲JSONArray – piguy