2016-08-22 24 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的:所有的JSON的

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

抱歉,但我不知道如何使用這個庫。 –

+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。問題是如果你得到的東西不是StringJSONObject它不會被解析。

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

看到我得到了尼古拉斯MAHUT的排名1,原本HINGIS M.是1排名 –

1

首先是不正確 ,你可以驗證它jsonlint

http://www.jsonlint.com/

這是我面臨的,同時驗證你的json

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

這應該是一個評論 – 0xDEADC0DE

+0

問題是我不能更改json,因爲這是客戶購買的高級帳戶,我已經郵寄給支持團隊,但他們沒有回覆我。這就是爲什麼我試圖找到解決方案, –

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 
    } 
相關問題