使用Gson将Json转换为Java Object

时间:2015-04-25 03:30:37

标签: java json class gson

我目前正在开发一个使用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无法获取信息并将其存储到对象中?谁能解释一下我遇到的这个问题?我很想知道我是否正确设置了课程。

2 个答案:

答案 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方法。