Android 解析后台返回为Json数据实例教程

大家好,今天给大家分享下Android解析Json的例子,我这里自己安装了Tomcat,让自己电脑充当下服务器,最重要的是,返回结果自己可以随便修改。
  首先看下Json的定义,以及它和XML的比较:
  JSON的定义:
  一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org
  JSON Vs XML
  1.JSON和XML的数据可读性基本相同
  2.JSON和XML同样拥有丰富的解析手段
  3.JSON相对于XML来讲,数据的体积小
  4.JSON与JavaScript的交互更加方便
  5.JSON对数据的描述性比XML较差
  6.JSON的速度要远远快于XML.
  Tomcat安装:
  Tomcat下载地址http://tomcat.apache.org/ 下载后安装,如果成功,启动Tomcat,然后在浏览器里输入:http://localhost:8080/index.jsp,会有个Tomcat首页界面,

  我们在Tomcat安装目录下webapps\ROOT下找到index.jsp,然后新建一个index2.jsp,用记事本或者什么的,编辑内容如下:

1  {students:[{name:'魏祝林',age:25},{name:'阿魏',age:26}],class:'三年二班'}

  然后我们在浏览器里输入:http://localhost:8080/index2.jsp返回的结果如下(这就模拟出后台返回的数据了):   新建一个Android工程JsonDemo.   工程目录如下:   这里我封装了一个JSONUtil工具类,代码如下:

001  package com.tutor.jsondemo;
002  import java.io.IOException;
003  import java.io.InputStreamReader;
004  import java.io.UnsupportedEncodingException;
005  import org.apache.http.HttpEntity;
006  import org.apache.http.HttpResponse;
007  import org.apache.http.client.methods.HttpGet;
008  import org.apache.http.impl.client.DefaultHttpClient;
009  import org.apache.http.params.BasicHttpParams;
010  import org.apache.http.protocol.HTTP;
011  import org.json.JSONException;
012  import org.json.JSONObject;
013  import android.util.Log;
014  /**
015  * @author frankiewei.
016  * Json封装的工具类.
017  */
018  public class JSONUtil {
019  private static final String TAG = "JSONUtil";
020  /**
021  * 获取json内容
022  * @param url
023  * @return JSONArray
024  * @throws JSONException
025  * @throws ConnectionException
026  */
027  public static JSONObject getJSON(String url) throws JSONException, Exception {
028  return new JSONObject(getRequest(url));
029  }
030  /**
031  * 向api发送get请求,返回从后台取得的信息。
032  *
033  * @param url
034  * @return String
035  */
036  protected static String getRequest(String url) throws Exception {
037  return getRequest(url, new DefaultHttpClient(new BasicHttpParams()));
038  }
039  /**
040  * 向api发送get请求,返回从后台取得的信息。
041  *
042  * @param url
043  * @param client
044  * @return String
045  */
046  protected static String getRequest(String url, DefaultHttpClient client) throwsException {
047  String result = null;
048  int statusCode = 0;
049  HttpGet getMethod = new HttpGet(url);
050  Log.d(TAG, "do the getRequest,url="+url+"");
051  try {
052  //getMethod.setHeader("User-Agent", USER_AGENT);
053  HttpResponse httpResponse = client.execute(getMethod);
054  //statusCode == 200 正常
055  statusCode = httpResponse.getStatusLine().getStatusCode();
056  Log.d(TAG, "statuscode = "+statusCode);
057  //处理返回的httpResponse信息
058  result = retrieveInputStream(httpResponse.getEntity());
059  } catch (Exception e) {
060  Log.e(TAG, e.getMessage());
061  throw new Exception(e);
062  } finally {
063  getMethod.abort();
064  }
065  return result;
066  }
067  /**
068  * 处理httpResponse信息,返回String
069  *
070  * @param httpEntity
071  * @return String
072  */
073  protected static String retrieveInputStream(HttpEntity httpEntity) {
074  int length = (int) httpEntity.getContentLength();
075  //the number of bytes of the content, or a negative number if unknown. If the content length is known but exceeds Long.MAX_VALUE, a negative number is returned.
076  //length==-1,下面这句报错,println needs a message
077  if (length < 0) length = 10000;
078  StringBuffer stringBuffer = new StringBuffer(length);
079  try {
080  InputStreamReader inputStreamReader = newInputStreamReader(httpEntity.getContent(), HTTP.UTF_8);
081  char buffer[] = new char[length];
082  int count;
083  while ((count = inputStreamReader.read(buffer, 0, length - 1)) > 0) {
084  stringBuffer.append(buffer, 0, count);
085  }
086  } catch (UnsupportedEncodingException e) {
087  Log.e(TAG, e.getMessage());
088  } catch (IllegalStateException e) {
089  Log.e(TAG, e.getMessage());
090  } catch (IOException e) {
091  Log.e(TAG, e.getMessage());
092  }
093  return stringBuffer.toString();
094  }
095  }
096  package com.tutor.jsondemo;
097  import java.io.IOException;
098  import java.io.InputStreamReader;
099  import java.io.UnsupportedEncodingException;
100  import org.apache.http.HttpEntity;
101  import org.apache.http.HttpResponse;
102  import org.apache.http.client.methods.HttpGet;
103  import org.apache.http.impl.client.DefaultHttpClient;
104  import org.apache.http.params.BasicHttpParams;
105  import org.apache.http.protocol.HTTP;
106  import org.json.JSONException;
107  import org.json.JSONObject;
108  import android.util.Log;
109  /**
110  * @author frankiewei.
111  * Json封装的工具类.
112  */
113  public class JSONUtil {
114  
115   private static final String TAG = "JSONUtil";
116  
117   /**
118   * 获取json内容
119   * @param url
120   * @return JSONArray
121   * @throws JSONException
122   * @throws ConnectionException
123   */
124   public static JSONObject getJSON(String url) throws JSONException, Exception {
125  
126   return new JSONObject(getRequest(url));
127   }
128  
129   /**
130   * 向api发送get请求,返回从后台取得的信息。
131   *
132   * @param url
133   * @return String
134   */
135   protected static String getRequest(String url) throws Exception {
136   return getRequest(url, new DefaultHttpClient(new BasicHttpParams()));
137   }
138  
139   /**
140   * 向api发送get请求,返回从后台取得的信息。
141   *
142   * @param url
143   * @param client
144   * @return String
145   */
146   protected static String getRequest(String url, DefaultHttpClient client) throwsException {
147   String result = null;
148   int statusCode = 0;
149   HttpGet getMethod = new HttpGet(url);
150   Log.d(TAG, "do the getRequest,url="+url+"");
151   try {
152   //getMethod.setHeader("User-Agent", USER_AGENT);
153   HttpResponse httpResponse = client.execute(getMethod);
154   //statusCode == 200 正常
155   statusCode = httpResponse.getStatusLine().getStatusCode();
156   Log.d(TAG, "statuscode = "+statusCode);
157   //处理返回的httpResponse信息
158   result = retrieveInputStream(httpResponse.getEntity());
159   } catch (Exception e) {
160   Log.e(TAG, e.getMessage());
161   throw new Exception(e);
162   } finally {
163   getMethod.abort();
164   }
165   return result;
166   }
167  
168   /**
169   * 处理httpResponse信息,返回String
170   *
171   * @param httpEntity
172   * @return String
173   */
174   protected static String retrieveInputStream(HttpEntity httpEntity) {
175  
176   int length = (int) httpEntity.getContentLength();
177   //the number of bytes of the content, or a negative number if unknown. If the content length is known but exceeds Long.MAX_VALUE, a negative number is returned.
178   //length==-1,下面这句报错,println needs a message
179   if (length < 0) length = 10000;
180   StringBuffer stringBuffer = new StringBuffer(length);
181   try {
182   InputStreamReader inputStreamReader = newInputStreamReader(httpEntity.getContent(), HTTP.UTF_8);
183   char buffer[] = new char[length];
184   int count;
185   while ((count = inputStreamReader.read(buffer, 0, length - 1)) > 0) {
186   stringBuffer.append(buffer, 0, count);
187   }
188   } catch (UnsupportedEncodingException e) {
189   Log.e(TAG, e.getMessage());
190   } catch (IllegalStateException e) {
191   Log.e(TAG, e.getMessage());
192   } catch (IOException e) {
193   Log.e(TAG, e.getMessage());
194   }
195   return stringBuffer.toString();
196   }
197  }
198  

  编写主Activity代码JSONDemoActivity,代码如下:

001  package com.tutor.jsondemo;
002  import org.json.JSONArray;
003  import org.json.JSONException;
004  import org.json.JSONObject;
005  import android.app.Activity;
006  import android.os.Bundle;
007  import android.widget.TextView;
008  public class JSONDemoActivity extends Activity {
009  /**
010  * 访问的后台地址,这里访问本地的不能用127.0.0.1应该用10.0.2.2
011  */
012  private static final String BASE_URL = "http://10.0.2.2:8080/index2.jsp";
013  private TextView mStudentTextView;
014  private TextView mClassTextView;
015  @Override
016  public void onCreate(Bundle savedInstanceState) {
017  super.onCreate(savedInstanceState);
018  setContentView(R.layout.main);
019  setupViews();
020  }
021  /**
022  * 初始化
023  */
024  private void setupViews(){
025  mStudentTextView = (TextView)findViewById(R.id.student);
026  mClassTextView = (TextView)findViewById(R.id.classes);
027  try {
028  //获取后台返回的Json对象
029  JSONObject mJsonObject = JSONUtil.getJSON(BASE_URL);
030  //获得学生数组
031  JSONArray mJsonArray = mJsonObject.getJSONArray("students");
032  //获取第一个学生
033  JSONObject firstStudent = mJsonArray.getJSONObject(0);
034  //获取班级
035  String classes = mJsonObject.getString("class");
036  String studentInfo = classes + "共有 " + mJsonArray.length() + " 个学生."
037  + "第一个学生姓名: " + firstStudent.getString("name")
038  + " 年龄: " + firstStudent.getInt("age");
039  mStudentTextView.setText(studentInfo);
040  mClassTextView.setText("班级: " + classes);
041  } catch (JSONException e) {
042  e.printStackTrace();
043  } catch (Exception e) {
044  e.printStackTrace();
045  }
046  }
047  }
048  package com.tutor.jsondemo;
049  import org.json.JSONArray;
050  import org.json.JSONException;
051  import org.json.JSONObject;
052  import android.app.Activity;
053  import android.os.Bundle;
054  import android.widget.TextView;
055  public class JSONDemoActivity extends Activity {
056   /**
057   * 访问的后台地址,这里访问本地的不能用127.0.0.1应该用10.0.2.2
058   */
059   private static final String BASE_URL = "http://10.0.2.2:8080/index2.jsp";
060  
061   private TextView mStudentTextView;
062  
063   private TextView mClassTextView;
064  
065  
066  @Override
067  public void onCreate(Bundle savedInstanceState) {
068  super.onCreate(savedInstanceState);
069  setContentView(R.layout.main);
070  setupViews();
071  }
072  /**
073  * 初始化
074  */
075  private void setupViews(){
076   mStudentTextView = (TextView)findViewById(R.id.student);
077   mClassTextView = (TextView)findViewById(R.id.classes);
078  
079   try {
080   //获取后台返回的Json对象
081   JSONObject mJsonObject = JSONUtil.getJSON(BASE_URL);
082  
083   //获得学生数组
084   JSONArray mJsonArray = mJsonObject.getJSONArray("students");
085   //获取第一个学生
086   JSONObject firstStudent = mJsonArray.getJSONObject(0);
087   //获取班级
088   String classes = mJsonObject.getString("class");
089  
090  
091  
092   String studentInfo = classes + "共有 " + mJsonArray.length() + " 个学生."
093   + "第一个学生姓名: " + firstStudent.getString("name")
094   + " 年龄: " + firstStudent.getInt("age");
095  
096   mStudentTextView.setText(studentInfo);
097  
098   mClassTextView.setText("班级: " + classes);
099   } catch (JSONException e) {
100   e.printStackTrace();
101   } catch (Exception e) {
102   e.printStackTrace();
103   }
104  }
105  }
106  

  这里用到的布局文件main.xml代码如下:   

01  view plaincopyprint?<?xml version="1.0" encoding="utf-8"?>
02  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03  android:layout_width="fill_parent"
04  android:layout_height="fill_parent"
05  android:orientation="vertical" >
06  <TextView
07  android:id="@+id/student"
08  android:layout_width="fill_parent"
09  android:layout_height="wrap_content"
10  android:text="@string/hello" />
11  <TextView
12  android:id="@+id/classes"
13  android:layout_width="fill_parent"
14  android:layout_height="wrap_content"
15  />
16  </LinearLayout>
17  <?xml version="1.0" encoding="utf-8"?>
18  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
19  android:layout_width="fill_parent"
20  android:layout_height="fill_parent"
21  android:orientation="vertical" >
22  <TextView
23  android:id="@+id/student"
24  android:layout_width="fill_parent"
25  android:layout_height="wrap_content"
26  android:text="@string/hello" />
27  <TextView
28  android:id="@+id/classes"
29  android:layout_width="fill_parent"
30  android:layout_height="wrap_content"
31  />
32  </LinearLayout>
33  

  最后要在AndroidMainfest.xml中添加访问网络权限:  

01  view plaincopyprint?<?xml version="1.0" encoding="utf-8"?>
02  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
03  package="com.tutor.jsondemo"
04  android:versionCode="1"
05  android:versionName="1.0" >
06  <uses-permission android:name="android.permission.INTERNET"></uses-permission>
07  <application
08  android:icon="@drawable/ic_launcher"
09  android:label="@string/app_name" >
10  <activity
11  android:name=".JSONDemoActivity"
12  android:label="@string/app_name" >
13  <intent-filter>
14  <action android:name="android.intent.action.MAIN" />
15  <category android:name="android.intent.category.LAUNCHER" />
16  </intent-filter>
17  </activity>
18  </application>
19  </manifest>
20  <?xml version="1.0" encoding="utf-8"?>
21  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
22  package="com.tutor.jsondemo"
23  android:versionCode="1"
24  android:versionName="1.0" >
25   <uses-permission android:name="android.permission.INTERNET"></uses-permission>
26  <application
27  android:icon="@drawable/ic_launcher"
28  android:label="@string/app_name" >
29  <activity
30  android:name=".JSONDemoActivity"
31  android:label="@string/app_name" >
32  <intent-filter>
33  <action android:name="android.intent.action.MAIN" />
34  <category android:name="android.intent.category.LAUNCHER" />
35  </intent-filter>
36  </activity>
37  </application>
38  </manifest>
39  

 

转载:http://ye-good-job.iteye.com/blog/1647674





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值