2015-04-25 41 views
1

我目前正在使用Steam Web API的項目中工作。 API以JSON格式返回數據,我想製作一個使用這些數據的Java程序。下面是從API以下JSON格式:使用Gson將Json轉換爲Java對象

{ 
    "response": { 
     "players": [ 
      { 
       "steamid": "---", 
       "communityvisibilitystate": 1, 
       "profilestate": 1, 
       "personaname": "---", 
       "lastlogoff": 1429915502, 
       "profileurl": "---", 
       "avatar": "---", 
       "avatarmedium": "---", 
       "avatarfull": "---", 
       "personastate": 0 
      } 
     ] 

    } 
} 

我使用谷歌的API JSON稱爲GSON和我有麻煩設置Java類,這樣我就可以使用fromJson()方法。

從JSON數據中,我知道有一個包含所有數據的對象數組。令我困惑的一件事是外部標籤response。我知道我必須構建一個代表players對象的類,但是我還必須創建一個代表response的類,因爲它包含了players

截至目前,我有一個名爲Response.java文件,該文件包含以下內容:

public class Response { 

    private ArrayList<Player> playerSummaries = new ArrayList<Player>(); 

    public String toString() { 
     return playerSummaries.get(0).toString(); 
    } 

} 


class Player { 
    private String steamid; 
    private String personaname; 


    public String getSteamID() { 
     return steamid; 
    } 

    public void setSteamID(String newSteamID) { 
     steamid = newSteamID; 
    } 

    public String getPersonaName() { 
     return personaname; 
    } 

    public void setPersonaName(String name) { 
     personaname = name; 
    } 

    //Rest of getters and setters omitted. 

    @Override 
    public String toString() { 
     return "<<" + "steamid=" + steamid + "\n" + "name=" + personaname + "\n" + ">>"; 
    } 
} 

我只包括我打算使用的變量。上面字符串中包含的JSON數據稱爲jsonData,這是我在我的主要方法正在測試:

Response response = gson.fromJson(jsonData, Response.class); 

System.out.println(response.getPlayerAt(0)); 

但是,在運行這給了我IndexOutOfBoundsException異常。似乎Gson無法獲取信息並將其存儲到一個對象中?任何人都可以解釋我遇到的這個問題嗎?我很想知道我是否正確設置了課程。

+0

是否要返回索引0處的播放器或迭代整個數組列表? – kirti

+0

當談到編寫與JSON模式相匹配的POJO類時,我發現將我的代碼與在線工具自動生成的代碼進行比較非常有用,例如http://www.jsonschema2pojo.org/ – Javide

+0

@kirti我只返回玩家在索引0處用於測試目的。 –

回答

3

更換

private ArrayList<Player> playerSummaries = new ArrayList<Player>(); 

private ArrayList<Player> players = new ArrayList<Player>(); 

GSON使用反射來查找它應該填充的字段。在你的情況下,它正在查找你是否有一個名爲players的字段,但你不知道。

您也不需要實例化該字段,GSON會爲您做到這一點。

編輯:

你還需要在你的頂層對象的包裝類。所以

class MyObject { 
    public Response response; 
} 

MyObject myObject = gson.fromJson(jsonData, MyObject.class); 
+0

我已將'playerSummaries'更改爲'players',但必須保留'new ArrayList ()',否則我會得到一個NullPointerException。但是,當我嘗試訪問ArrayList中的第一個元素時,我仍然收到IndexOutOfBoundsException。你知道這個工作是否需要訪問器和增變器嗎? –

+0

確定更新了我的答案。 –

+0

確保你做'MyObject myObject = gson.fromJson(...)' –

0

爲什麼你正在使用

System.out.println(response.getPlayerAt(0)); 

您應該使用

response.getPlayerSummaries.get(0); 

其中getPlayers是您

private ArrayList<Player> playerSummaries = new ArrayList<Player>(); 

getPlayerSummaries的吸氣將獲得ArrayList和再你會用ge t數組列表的方法。