如何从一个非常大的JSON数组中获取数据?

时间:2014-05-29 08:48:20

标签: java android arrays json jsonobject

我正在为游戏使用API​​,它会返回一个非常大的JSON对象。问题是,当我尝试访问其中的整数时,它无法正常工作并在logcat中显示一部分JSON对象,带有橙色文本system.err。如何在这个数组中访问我想要的任何值?

json对象的代码和结构如下所示。

private class getGame extends AsyncTask<Integer, Integer, String>{

        Context context;
        private getGame(Context context) {
            this.context = context.getApplicationContext();
        }

        String response;


        @Override
        protected String doInBackground(Integer... params) {
            HttpClient client = new DefaultHttpClient();
            String geturl = "https://eu.api.pvp.net/api/lol/tr/v1.3/game/by-summoner/1795120/recent?api_key=cea2196c-6a12-474f-8f6d-52ad5e612cbc";
            HttpGet get = new HttpGet(geturl);
            HttpResponse responseGet = null;
            try {
                responseGet = client.execute(get);
                HttpEntity resEntityGet = responseGet.getEntity();
                response = EntityUtils.toString(resEntityGet);
                JSONObject jsonObj = new JSONObject(response);
                JSONObject gamesObj = jsonObj.getJSONObject("games");
                JSONObject game0 = jsonObj.getJSONObject("0");
                Log.e("test", ""+game0.getInt("gameId"));
                return "";

            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }

This是Json对象和logcat警告的结构,示例jsonobject是here

2 个答案:

答案 0 :(得分:4)

试试这个..

{                // JSONObject
  "games": [     // JSONArray

更改此

JSONObject gamesObj = jsonObj.getJSONObject("games");

JSONArray gamesObj = jsonObj.getJSONArray("games").getJSONObject(0).getJSONArray("fellowPlayers");
JSONObject game0 = jsonObj.getJSONObject(0);

更多说明

JSONObject jsonObj = new JSONObject(response);
JSONArray gamesarray = jsonObj.getJSONArray("games");
JSONObject game0 = gamesarray.getJSONObject(0);
JSONArray fellowarray = game0.getJSONArray("fellowPlayers");
JSONObject fellow0 = fellowarray.getJSONObject(0);
Log.e("test", ""+fellow0.getInt("gameId"));

答案 1 :(得分:0)

如果你真的想要解析一个非常大的json,请使用允许流式传输的json库。

http://wiki.fasterxml.com/JacksonInFiveMinutes(查看Streaming API示例)

杰克逊确实允许Streaming。

如果你只是不知道如何解析数组,那么你应该改变你的问题。

如果你只是想解析一个数组,你必须验证是否有{或[是一个对象或一个数组。您还可以使用

验证结果是数组还是对象
JSONObject json;
Object     info;
JSONArray  infoJsonArray;
JSONObject infoObject;
json = new JSONObject(str);

Object info= json.get("games");
if (info instanceof JSONArray) {
// It's an array
infoJsonArray = (JSONArray)info;
}
else if (info instanceof JSONObject) {
// It's an object
infoObject = (JSONObject)info;
} else {
// It's something else, like a string or number
}