【问题标题】:how to get all json object如何获取所有json对象
【发布时间】:2016-12-28 14:51:48
【问题描述】:

我找到了很多答案,但它表示字符串,我想要所有 jsonobjects LINK1 LINK2

这是我的 json

         {
            timestamp: 1471845537300,
            list: {
            724206: {
            id: "724206",
            name: "HINGIS M. (SUI)",
            points: "10790",
            ranking: "1",
            tour: "WTA-D",
            lastUpdate: "2016-08-15"
            },
            724207: {
            id: "724207",
            name: "MIRZA S. (IND)",
            points: "10790",
            ranking: "2",
            tour: "WTA-D",
            lastUpdate: "2016-08-15"
            },
            724208: {
            id: "724208",
            name: "GARCIA C. (FRA)",
            points: "6210",
            ranking: "3",
            tour: "WTA-D",
            lastUpdate: "2016-08-15"
            },
            724209: {
            id: "724209",
            name: "MLADENOVIC K. (FRA)",
            points: "6045",
            ranking: "4",
            tour: "WTA-D",
            lastUpdate: "2016-08-15"
            },
    type: "TENNIS RANKING"

            }
}

我添加了一个截图,所以你可以理解

我试过了。

 public class GetData extends AsyncTask<String, Void, Void> {

        String responseString;
        Response response;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(String... str) {

            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url("MY url")
                    .build();

            try {

                response = client.newCall(request).execute();
                if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
                {
                    responseString = response.body().string();
                    System.out.println(responseString);
                    response.body().close();
                }

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

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            if (responseString != null) {

                try {
                    JSONObject jObject = new JSONObject(responseString).getJSONObject("list");
                    Iterator<String> keys = jObject.keys();
                    while (keys.hasNext()) {
                        String key = keys.next();
                        Log.v("**********", "**********");
                        Log.v("list key", key);
                        JSONObject innerJObject = jObject.getJSONObject(key);
                        Iterator<String> innerKeys = innerJObject.keys();
                        while (innerKeys.hasNext()) {
                            String innerKkey = keys.next();
                            String value = innerJObject.getString(innerKkey);
                            Log.v("key = " + key, "value = " + value);
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }else{
                Toast.makeText(getActivity(), "Couldn't get response", Toast.LENGTH_SHORT).show();
            }

        }
    }

LOGCAT:

   08-22 15:11:51.222 12592-12592/com.bicubic.tennis V/list key: type
08-22 15:11:51.222 12592-12592/com.bicubic.tennis V/key = type: value = TENNIS RANKING
08-22 15:11:51.222 12592-12592/com.bicubic.tennis V/list key: 725406
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725406, name = NICOLAS MAHUT (FRA), points = 9475, ranking = 1, tour = ATP-D, lastUpdate = 2016-08-22
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/list key: 725407
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725407, name = PIERRE-HUGUES HERBERT (FRA), points = 9085, ranking = 2, tour = ATP-D, lastUpdate = 2016-08-22
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/list key: 725408
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725408, name = MARCELO MELO (BRA), points = 7620, ranking = 3, tour = ATP-D, lastUpdate = 2016-08-22
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/list key: 725409
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725409, name = JAMIE MURRAY (GBR), points = 6805, ranking = 4, tour = ATP-D, lastUpdate = 2016-08-22
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/list key: 725410
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725410, name = BOB BRYAN (USA), points = 5750, ranking = 5, tour = ATP-D, lastUpdate = 2016-08-22
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/list key: 725411
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725411, name = MIKE BRYAN (USA), points = 5750, ranking = 6, tour = ATP-D, lastUpdate = 2016-08-22
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/list key: 725412
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725412, name = IVAN DODIG (CRO), points = 5630, ranking = 7, tour = ATP-D, lastUpdate = 2016-08-22
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/list key: 725413
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725413, name = BRUNO SOARES (BRA), points = 5480, ranking = 8, tour = ATP-D, lastUpdate = 2016-08-22
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/list key: 725414
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725414, name = HORIA TECAU (ROU), points = 5420, ranking = 9, tour = ATP-D, lastUpdate = 2016-08-22
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/list key: 725415
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725415, name = RAVEN KLAASEN (RSA), points = 5120, ranking = 10, tour = ATP-D, lastUpdate = 2016-08-22
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/list key: 725416
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725416, name = JEAN-JULIEN ROJER (NED), points = 4810, ranking = 11, tour = ATP-D, lastUpdate = 2016-08-22
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/list key: 725417
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725417, name = DANIEL NESTOR (CAN), points = 4440, ranking = 12, tour = ATP-D, lastUpdate = 2016-08-22
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/list key: 725418
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725418, name = EDOUARD ROGER-VASSELIN (FRA), points = 4350, ranking = 13, tour = ATP-D, lastUpdate = 2016-08-22
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/list key: 725419
08-22 15:11:51.223 12592-12592/com.bicubic.tennis V/details: id = 725419, name = VASEK POSPISIL (CAN), points = 4330, ranking = 14, tour = ATP-D, lastUpdate = 2016-08-22

【问题讨论】:

  • 您可以使用 gson 或 jackson 转换器进行改造...
  • 对不起,我不知道如何使用这个库。
  • 我在回答中添加了详细信息
  • 谢谢你的信息,但这需要时间,我需要紧急解决方案。
  • 只有在您不更改 json 之前,它才会成为解决方法。

标签: android android-json


【解决方案1】:

首先你的 json 不正确 因为你可以在 jsonlint 上验证它

http://www.jsonlint.com/

这就是我在验证您的 json 时所面临的问题

Error: Parse error on line 1:
 {  timestamp: 147184553
----^
Expecting 'STRING', '}', got 'undefined'

【讨论】:

  • 这应该是一条评论
  • 问题是我无法更改 json,因为这是客户购买的高级帐户,我已经邮寄给支持团队,但他们没有回复我。这就是为什么我试图找到解决方案
【解决方案2】:

您应该使用 retrofit 和 gson 或 jackson 来调用 API

上面有很好的解释https://guides.codepath.com/android/Consuming-APIs-with-Retrofit

使用改造,您也无需编写 asyncTask。

还有另一个库 volley 可以调用 API。

【讨论】:

    【解决方案3】:

    首先您需要将其设为有效的 JSON,因为它是无效的。您可以像这样重写 JSON 以使其有效且易于解析。

    {
    "timestamp": 1471845537300,
    "list": [{
    
        "id": "724206",
        "name": "HINGIS M. (SUI)",
        "points": "10790",
        "ranking": "1",
        "tour": "WTA-D",
        "lastUpdate": "2016-08-15"
    }, {
        "id": "724207",
        "name": "MIRZA S. (IND)",
        "points": "10790",
        "ranking": "2",
        "tour": "WTA-D",
        "lastUpdate": "2016-08-15"
    }, {
        "id": "724208",
        "name": "GARCIA C. (FRA)",
        "points": "6210",
        "ranking": "3",
        "tour": "WTA-D",
        "lastUpdate": "2016-08-15"
    }, {
        "id": "724209",
        "name": "MLADENOVIC K. (FRA)",
        "points": "6045",
        "ranking": "4",
        "tour": "WTA-D",
        "lastUpdate": "2016-08-15"
    }]}
    

    你可以像这样解析 JSON:

          //Create an object
        JSONObject obj = new JSONObject(responseString);
    
        obj.optLong("timestamp");
    
        //access your list array
        JSONArray list = obj.optJSONArray("list");
    
        for (int i = 0; i < list.length(); i++) {
            JSONObject post = list.optJSONObject(i);
    
            post.optString("id");
            post.optString("name");
            post.optString("points");
            post.optString("ranking");
            post.optString("tour");
            post.optString("lastUpdate");
            //do whatever you wants to do with these strings
        }
    

    【讨论】:

      【解决方案4】:

      前提是你的JSON是这样的,

      {
          "timestamp": 1471845537300,
          "list": {
              "724206": {
                  "id": "724206",
                  "name": "HINGIS M. (SUI)",
                  "points": "10790",
                  "ranking": "1",
                  "tour": "WTA-D",
                  "lastUpdate": "2016-08-15"
              },
              "724207": {
                  "id": "724207",
                  "name": "MIRZA S. (IND)",
                  "points": "10790",
                  "ranking": "2",
                  "tour": "WTA-D",
                  "lastUpdate": "2016-08-15"
              },
              "724208": {
                  "id": "724208",
                  "name": "GARCIA C. (FRA)",
                  "points": "6210",
                  "ranking": "3",
                  "tour": "WTA-D",
                  "lastUpdate": "2016-08-15"
              },
              "724209": {
                  "id": "724209",
                  "name": "MLADENOVIC K. (FRA)",
                  "points": "6045",
                  "ranking": "4",
                  "tour": "WTA-D",
                  "lastUpdate": "2016-08-15"
              },
              "type": "TENNIS RANKING"
          }
      }
      

      注意:我不确定type 是在list 对象的外部还是内部。我认为它在 list 对象内(通常情况下不应该如此)。

      这是一个关于如何解析这个的快速而肮脏的解决方案,您可以使用instanceof 关键字来检查数据是String 还是JSONObject。问题是,如果您得到的不是String 或JSONObject,它将不会被解析。

      try {
          JSONObject jObject = new JSONObject(responseString).getJSONObject("list");
          Iterator<String> keys = jObject.keys();
          while (keys.hasNext()) {
              String key = keys.next();
              Log.v("list key", key);
              if(jObject.get(key) instanceof JSONObject) {
                  JSONObject innerJObject = jObject.getJSONObject(key);
                  String id = innerJObject.getString("id");
                  String name = innerJObject.getString("name");
                  String points = innerJObject.getString("points");
                  String ranking = innerJObject.getString("ranking");
                  String tour = innerJObject.getString("tour");
                  String lastUpdate = innerJObject.gettString("lastUpdate");
                  Log.v("details", "id = " + id + ", " + "name = " + name + ", " + "points = " + points + ", " + "ranking = " + ranking + ", " + "tour = " + tour + ", " + "lastUpdate = " + lastUpdate);
              } else if (jObject.get(key) instanceof String){
                  String value = jObject.getString("type");
                  Log.v("key = type", "value = " + value);
              }
          }
      } catch (JSONException e) {
          e.printStackTrace();
      }
      

      输出,

      list key: 724207
      details: id = 724207, name = MIRZA S. (IND), points = 10790, ranking = 2, tour = WTA-D, lastUpdate = 2016-08-15
      list key: 724208
      details: id = 724208, name = GARCIA C. (FRA), points = 6210, ranking = 3, tour = WTA-D, lastUpdate = 2016-08-15
      list key: 724209
      details: id = 724209, name = MLADENOVIC K. (FRA), points = 6045, ranking = 4, tour = WTA-D, lastUpdate = 2016-08-15
      list key: type
      key = type: value = TENNIS RANKING
      list key: 724206
      details: id = 724206, name = HINGIS M. (SUI), points = 10790, ranking = 1, tour = WTA-D, lastUpdate = 2016-08-15
      

      【讨论】:

      • 它工作,但给我一个奇怪的反应,比如第一个值是 724206,我得到一些其他随机值
      • 它是您回复中的id 字段。只获取您需要的数据。
      • 看到我在 NICOLAS MAHUT 获得了 1 名,原来 HINGIS M. 是 1 名
      • 我添加了您编辑的代码,但没有得到适当的价值感谢您的努力
      • 排名 1 是 HINGIS M. 但我得到了 NICOLAS MAHUT
      猜你喜欢
      • 2016-02-18
      • 1970-01-01
      • 2015-09-10
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2021-09-24
      相关资源
      最近更新 更多