繁体   English   中英

使用Gson将Json转换为Java Object

[英]Using Gson to convert Json into Java Object

我目前正在开发一个使用Steam Web API的项目。 API以JSON格式返回数据,我想制作一个使用这些数据的Java程序。 以下是API中的以下JSON格式:

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

    }
}

我正在使用谷歌的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的String中,这就是我在main方法中测试的内容:

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

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

但是,运行它会给我一个IndexOutOfBoundsException。 好像Gson无法获取信息并将其存储到对象中? 谁能解释一下我遇到的这个问题? 我很想知道我是否正确设置了我的课程。

更换

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

你为什么用

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

你应该用

response.getPlayerSummaries.get(0); 

其中getPlayers是你的getter

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

getPlayerSummaries将获得arraylist,然后你将使用arraylist类的get方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM