我目前正在开发一个使用Steam Web API的项目。 API以JSON格式返回数据,我想制作一个使用这些数据的Java程序。以下是API中的以下JSON格式:
{
"response": {
"players": [
{
"steamid": "---",
"communityvisibilitystate": 1,
"profilestate": 1,
"personaname": "---",
"lastlogoff": 1429915502,
"profileurl": "---",
"avatar": "---",
"avatarmedium": "---",
"avatarfull": "---",
"personastate": 0
}
]
}
}
我正在使用Google的JSON API,名为Gson,我在设置Java类时遇到问题,因此我可以使用fromJson()
方法。
从JSON数据中,我知道有一组包含所有数据的players
个对象。令我困惑的一件事是名为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
的字符串中,这就是我在main方法中测试的内容:
Response response = gson.fromJson(jsonData, Response.class);
System.out.println(response.getPlayerAt(0));
但是,运行它会给我一个IndexOutOfBoundsException。好像Gson无法获取信息并将其存储到对象中?谁能解释一下我遇到的这个问题?我很想知道我是否正确设置了课程。
答案 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);
答案 1 :(得分:0)
为什么使用
System.out.println(response.getPlayerAt(0));
你应该使用
response.getPlayerSummaries.get(0);
其中getPlayers是
的吸气剂 private ArrayList<Player> playerSummaries = new ArrayList<Player>();
getPlayerSummaries将获得arraylist,然后你将使用arraylist类的get方法。