2013-11-25 154 views
0

我正在写一个应用程序,我正在使用JSON将数据提取到ListView中,并且我已经为第一级(eventName)获取数据,但在获取第二级(angelName)时获取空白活动...使用JSON获取数据

JSON: -

[ 
    { 
    "eventName" : "Honda Motors", 
    "angelList" : [ 
    { 
    "angelID": "1", 
     "angelName": "Angel A" 
    }, 
    { 
    "angelID": "2", 
     "angelName": "Angel B" 
    } 
    ] 
    } 
] 

总之,无法得到AngelName,

AngelsActivity.java:-

public class AngelsActivity extends ListActivity { 
    // Connection detector 
     ConnectionDetector cd; 

     // Alert dialog manager 
     AlertDialogManager alert = new AlertDialogManager(); 

     // Progress Dialog 
     private ProgressDialog pDialog; 

     // Creating JSON Parser object 
     JSONParser jsonParser = new JSONParser(); 

     ArrayList<HashMap<String, String>> angelsList; 

     // albums JSONArray 
     JSONArray arrayAngels = null; 

     // Category name 
     String category_Name; 

     // ALL JSON node names 
     private static final String ANGEL_NAME = "angelName"; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity); 

      cd = new ConnectionDetector(getApplicationContext()); 

      // Check for internet connection 
      if (!cd.isConnectingToInternet()) { 
       // Internet Connection is not present 
       alert.showAlertDialog(AngelsActivity.this, "Internet Connection Error", 
         "Please connect to working Internet connection", false); 
       // stop executing code by return 
       return; 
      } 

      // Hashmap for ListView 
      angelsList = new ArrayList<HashMap<String, String>>(); 

      // Loading Albums JSON in Background Thread 
      new LoadAlbums().execute(); 

      // get listview 
      ListView lv = getListView(); 

      /** 
      * Listview item click listener 
      * TrackListActivity will be lauched by passing album id 
      * */ 
      lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> arg0, View view, int arg2, 
         long arg3) { 

       } 
      });  
     } 

     /** 
     * Background Async Task to Load all Albums by making http request 
     * */ 
     class LoadAlbums extends AsyncTask<String, String, String> { 

      /** 
      * Before starting background thread Show Progress Dialog 
      * */ 
      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       pDialog = new ProgressDialog(AngelsActivity.this); 
       pDialog.setMessage("Listing Angels ..."); 
       pDialog.setIndeterminate(false); 
       pDialog.setCancelable(false); 
       pDialog.show(); 
      } 

      /** 
      * getting Categories JSON 
      * */ 
      protected String doInBackground(String... args) { 
       // Building Parameters 
       List<NameValuePair> params = new ArrayList<NameValuePair>(); 

       // getting JSON string from URL 
       String json = jsonParser.makeHttpRequest(EventsActivity.URL_CATEGORIES, "GET", 
         params); 

       try {    
        arrayAngels = new JSONArray(json); 

        if (arrayAngels != null) { 

         // looping through All albums 
         for (int i = 0; i < arrayAngels.length(); i++) { 
          JSONObject c = arrayAngels.getJSONObject(i); 

          // Storing each json item values in variable 
          String name = c.getString(ANGEL_NAME); 

          // creating new HashMap 
          HashMap<String, String> map = new HashMap<String, String>(); 

          // adding each child node to HashMap key => value 
          map.put(ANGEL_NAME, name);       

          // adding HashList to ArrayList 
          angelsList.add(map); 
         } 
        }else{ 
         Log.d("Angels: ", "null"); 
        } 

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

       return null; 
      } 

      /** 
      * After completing background task Dismiss the progress dialog 
      * **/ 
      protected void onPostExecute(String file_url) { 
       // dismiss the dialog after getting all albums 
       pDialog.dismiss(); 
       // updating UI from Background Thread 
       runOnUiThread(new Runnable() { 
        public void run() { 
         /** 
         * Updating parsed JSON data into ListView 
         * */ 
         ListAdapter adapter = new SimpleAdapter(
           AngelsActivity.this, angelsList, 
           R.layout.list_item, 
           new String[] {ANGEL_NAME}, 
           new int[] {R.id.category_name }); 

         // updating listview 
         setListAdapter(adapter); 
        } 
       }); 
      } 
     } 
    } 

回答

1

试试这个,

protected String doInBackground(String... args) { 
       List<NameValuePair> params = new ArrayList<NameValuePair>(); 

       // getting JSON string from URL 
       String json = jsonParser.makeHttpRequest(EventsActivity.URL_CATEGORIES, "GET", 
         params); 

       try {    
        arrayAngels = new JSONArray(json).getJSONObject(0).getJSONArray("angelList"); 

        if (arrayAngels != null) { 

         // looping through All albums 
         for (int i = 0; i < arrayAngels.length(); i++) { 
          JSONObject c = arrayAngels.getJSONObject(i); 

          // Storing each json item values in variable 
          String name = c.getString(ANGEL_NAME); 

          // creating new HashMap 
          HashMap<String, String> map = new HashMap<String, String>(); 

          // adding each child node to HashMap key => value 
          map.put(ANGEL_NAME, name);       

          // adding HashList to ArrayList 
          angelsList.add(map); 
         } 
        }else{ 
         Log.d("Angels: ", "null"); 
        } 

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

       return null; 
      } 
+0

做的感谢...非常coolll ...非常需要和太容易 – Sun

+0

@Abrahim Neil欢迎 – SathishKumar

+0

获得所有事件的第一个事件的天使名称,如EventA(AngelA,AngelB),EventB(AngelC,AngelD)。所以我得到AngelA&AngelB,或者我点击EventA或EventB,为什么? – Sun

0

试试这个..

for (int i = 0; i < arrayAngels.length(); i++) { 
     JSONObject c = arrayAngels.getJSONObject(i); 

     // Storing each json item values in variable 
     String name = c.getString(ANGEL_NAME); 
     JSONArray angels = c.getJSONArray("angelList"); 
     for (int j = 0; j < angels.length(); j++) { 
      JSONObject c1 = arrels.getJSONObject(j); 
      Log.v("angelName",c1.getString(ANGEL_NAME)); 
     } 
} 
+0

仍然没有得到,请给我一些更多的代码 – Sun

1

看来,你没有在合适的水平取出一个JSONArray。

你得到的JSONArray arrayAngels实际上是一个只包含一个元素的数组。要获得包含天使的数组,你需要更进一步:

JSONArray allAngels = arrayAngels.getJSONObject(0).getJSONArray("angelList"); 

您从数据读取第一JSONArray是一种元素的数组,其中包含的一切。该数组中包含的第一个(也是唯一的)JSONObject仍包含所有数据。只有当你从这个对象中得到JSONArray时,你才能得到你想要的。

编辑:完整的代码示例:

JSONObject jsonData = new JSONArray(json).getJSONObject(0); 
arrayAngels = jsonData.optJSONArray("angelList"); 

if (arrayAngels != null) { 
    // Code to process arrayAngels 
} 

jsonData还包含eventName的数据,如果你想同时使用。请注意,如果getJSONArray()找不到所需的密钥,则会引发异常,所以最好使用optJSONArray,如果该密钥不在数据中,则返回null。

+0

请您能不能告诉我在哪里,我在我的代码中使用这条线的方式.... – Sun

0

您必须首先获取Json数组“angelList”,然后您才能获得angelName值。

JSONArray arra = new JSONArray(json); 

JSONObject jobj=arra.getJSONObject(0); 

    arrayAngels = jobj.getJSONArray("angelList");