2016-08-22 3 views
0

я нахожу так много ответа, но он указывает на строку, и я хочу, чтобы все jsonobjects LINK1LINK2как получить все JSon объект

Вот мой 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" 

      } 
} 

я добавил скриншот так и можно долбить понять

enter image description here

Я попробовал это.

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 
+0

вы можете использовать переоснащения с gson или ДЖЕКСОН конвертора ... –

+0

извините, но я не знаю, как использовать этот LIBS. –

+0

Я добавил подробности в свой ответ –

ответ

1

условии, что ваш 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 
+0

, но он дал мне странный ответ, так как первое значение - 724206, и я получаю другое случайное значение –

+0

Его поле 'id' в вашем ответе. Возьмите только данные, которые вам нужны. –

+0

Смотрите, я получил ранг 1 с NICOLAS MAHUT и первоначально HINGIS M. был 1 ранг –

1

Прежде всего, ваш JSON неверен , как вы можете проверить его на jsonlint

http://www.jsonlint.com/

это то, что я столкнулся при проверке ваш json

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

Это должен быть комментарий – 0xDEADC0DE

+0

Проблема в том, что я не могу изменить json, потому что это премиум-аккаунт, приобретенный клиентом, и я уже отправил письмо в службу поддержки, но они did't Ответь мне. Вот почему я попытался найти решение для этого –

0

Вы должны использовать переоснащения с gson или Джексоном позвонить АНИ

Существует хорошее объяснение на нем https://guides.codepath.com/android/Consuming-APIs-with-Retrofit

с помощью переоснащения, вы нет необходимости писать AsyncTask а ,

Существует также другой залп библиотеки для вызова API.

0

Прежде всего, вам нужно сделать его действительным 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 
    } 
Смежные вопросы