2014-01-07 85 views
0

我有這樣的JSON字符串:解析JSON對象和JSON數組中的Android

{ 
    "query": { 
    "pages": { 
     "53113": { 
     "pageid": 53113, 
     "ns": 0, 
     "title": "Charing Cross", 
     "coordinates": [ 
      { 
      "lat": 51.5073, 
      "lon": -0.12755, 
      "primary": "", 
      "globe": "earth" 
      } 
     ] 
     }, 
     "33109245": { 
     "pageid": 33109245, 
     "ns": 0, 
     "title": "Equestrian statue of Charles I, Charing Cross", 
     "coordinates": [ 
      { 
      "lat": 51.5073, 
      "lon": -0.12768, 
      "primary": "", 
      "globe": "earth" 
      } 
     ] 
     }, 
     "4347521": { 
     "pageid": 4347521, 
     "ns": 0, 
     "title": "Greater London Built-up Area", 
     "coordinates": [ 
      { 
      "lat": 51.5073, 
      "lon": -0.1277, 
      "primary": "", 
      "globe": "earth" 
      } 
     ] 
     }, 
     "17867": { 
     "pageid": 17867, 
     "ns": 0, 
     "title": "London", 
     "coordinates": [ 
      { 
      "lat": 51.5072, 
      "lon": -0.1275, 
      "primary": "", 
      "globe": "earth" 
      } 
     ] 
     } 
    } 
    } 
} 

何我分析它? 我寫了這段代碼,但我無法遍歷json字符串。 我需要「標題」對象和「lat」和「lon」的「座標」數組...

我最終解決了這個問題。謝謝大家 解決這樣的:

  try { 
      // Parsing JSON String or URL 
      JSONObject jsonObj = new JSONObject(jsonurl); 


      // grabbing objects 
      JSONObject obj_query = jsonObj.getJSONObject(TAG_QUERY); 
      JSONObject obj_pages = obj_query.getJSONObject(TAG_PAGES); 
      JSONArray arr_id = obj_pages.names(); 

      for (int i = 0 ; i < arr_id.length() ; i ++) 
      { 
       JSONObject obj_id = obj_pages.getJSONObject(arr_id.get(i).toString()); 
       // Log.i(LOGTAG, "obj_id: " + obj_id.toString()); 

       String tag_pageid = obj_id.getString(TAG_PAGEID); 
       // String tag_ns = obj_id.getString(TAG_NS); 
       String tag_title = obj_id.getString(TAG_TITLE); 
       Log.i(LOGTAG, "page id: " + tag_pageid); 
       // Log.i(LOGTAG, tag_ns); 
       Log.i(LOGTAG, "Title: " + tag_title); 
       // using JSONArray to grab the TAG_COORDINATES 

       JSONArray arr_coord = obj_id.getJSONArray(TAG_COORDINATES); 
       // lets loop through the JSONArray and get all the items 
       for (int j = 0; j < arr_coord.length(); j++) { 
        // printing the values to the logcat 
        Log.i(LOGTAG, "lat:" + arr_coord.getJSONObject(j).getString(TAG_LAT).toString()); 
        Log.i(LOGTAG, "lon: " + arr_coord.getJSONObject(j).getString(TAG_LON).toString()); 
       } 

      } 

     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
+0

我不明白什麼是你的問題,我只是運行你的代碼和所有工作好... – GhostDerfel

+0

pages.keys()...在這裏問了很多次 – Selvin

+0

這個'''JSONObject tag_id = tag_pages.getJSONObject(TAG_PAGES);'''看起來應該改成更像這樣的東西''' 'JSONObject tag_id = tag_pages.getJSONObject(TAG_ID);'''我懷疑這行代碼沒有返回你期望的json。你想把Id從'''tag_pages'''對象中移出嗎? – Anderman

回答

1

droidQuery有一些方法,可以大大簡化這一任務:

$.getJSON(jsonurl, null, new Function() { 
    @Override 
    public void invoke($ d, Object… args) { 
     JSONObject json = (JSONObject) args[0]; 
     JSONObject query = json.getJSONObject(TAG_QUERY); 
     JSONObject pages = json.getJSONObject(TAG_PAGES); 
     Map<String, ?> map = $.map(pages); 
     for (Entry<String, ?> entry : map.entrySet()) { 
      String key = entry.getKey();//this is the number, such as 53113 
      JSONObject value = (JSONObject) entry.value(); 
      Map<String, ?> data = $.map(value);//contains all the fields you need 
      String title = (String) data.get("title");//<--- THIS IS THE TITLE FIELD 
      JSONArray array = (JSONArray) data.get("coordinates"); 
      Object[] data = $.array(array); 
      for (Object o : data) { 
       //loops through each coordinates object 
       JSONObject coordinates = (JSONObject) o;//<--- THIS IS THE FIRST COORDINATE OBJECT 
       //now handle this coordinates data: 
       Map<String, ?> coords = $.map(coordinates); 
       double lat = (double) coords.get("lat"); 
       double lon = (double) coords.get("lon"); 
       //etc... 
      } 
     } 
    } 
}); 
+0

哇。 @Phil這個jQuery的Android端口聽起來很酷,但目前我想專注於標準的Android實踐。將來我會在我的項目中使用它。我把它發佈到我的谷歌加。 https://plus.google.com/+GuyWestGuy/posts/RdjUMZpNviC –