我正在尝试解析从我的Android应用中的URL提取的JSON结果…
我已经在Internet上尝试了一些示例,但无法使其正常工作。JSON数据如下所示:
[ { "city_id": "1", "city_name": "Noida" }, { "city_id": "2", "city_name": "Delhi" }, { "city_id": "3", "city_name": "Gaziyabad" }, { "city_id": "4", "city_name": "Gurgaon" }, { "city_id": "5", "city_name": "Gr. Noida" } ]
提取URL和解析JSON数据的最简单方法是在列表视图中显示它
您可以使用AsyncTask,您必须进行自定义以满足您的需求,但是类似以下内容
AsyncTask
异步任务有三种主要方法:
onPreExecute() -最常用于设置和启动进度对话框
onPreExecute()
doInBackground() -建立连接并从服务器接收响应(请勿尝试将响应值分配给GUI元素,这是一个常见错误,无法在后台线程中完成)。
doInBackground()
onPostExecute() -这里我们不在后台线程中,因此我们可以使用响应数据进行用户界面操作,或者简单地将响应分配给特定的变量类型。
onPostExecute()
首先,我们将启动类,初始化一个String以将结果保存在方法外部但在类内部,然后运行onPreExecute()方法以建立简单的进度对话框。
String
class MyAsyncTask extends AsyncTask<String, String, Void> { private ProgressDialog progressDialog = new ProgressDialog(MainActivity.this); InputStream inputStream = null; String result = ""; protected void onPreExecute() { progressDialog.setMessage("Downloading your data..."); progressDialog.show(); progressDialog.setOnCancelListener(new OnCancelListener() { public void onCancel(DialogInterface arg0) { MyAsyncTask.this.cancel(true); } }); }
然后,我们需要建立连接以及我们如何处理响应:
@Override protected Void doInBackground(String... params) { String url_select = "http://yoururlhere.com"; ArrayList<NameValuePair> param = new ArrayList<NameValuePair>(); try { // Set up HTTP post // HttpClient is more then less deprecated. Need to change to URLConnection HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url_select); httpPost.setEntity(new UrlEncodedFormEntity(param)); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); // Read content & Log inputStream = httpEntity.getContent(); } catch (UnsupportedEncodingException e1) { Log.e("UnsupportedEncodingException", e1.toString()); e1.printStackTrace(); } catch (ClientProtocolException e2) { Log.e("ClientProtocolException", e2.toString()); e2.printStackTrace(); } catch (IllegalStateException e3) { Log.e("IllegalStateException", e3.toString()); e3.printStackTrace(); } catch (IOException e4) { Log.e("IOException", e4.toString()); e4.printStackTrace(); } // Convert response to string using String Builder try { BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"), 8); StringBuilder sBuilder = new StringBuilder(); String line = null; while ((line = bReader.readLine()) != null) { sBuilder.append(line + "\n"); } inputStream.close(); result = sBuilder.toString(); } catch (Exception e) { Log.e("StringBuilding & BufferedReader", "Error converting result " + e.toString()); } } // protected Void doInBackground(String... params)
最后,在这里我们将分析返回值,在此示例中,它是一个JSON数组,然后关闭该对话框:
protected void onPostExecute(Void v) { //parse JSON data try { JSONArray jArray = new JSONArray(result); for(i=0; i < jArray.length(); i++) { JSONObject jObject = jArray.getJSONObject(i); String name = jObject.getString("name"); String tab1_text = jObject.getString("tab1_text"); int active = jObject.getInt("active"); } // End Loop this.progressDialog.dismiss(); } catch (JSONException e) { Log.e("JSONException", "Error: " + e.toString()); } // catch (JSONException e) } // protected void onPostExecute(Void v) } //class MyAsyncTask extends AsyncTask<String, String, Void>