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) throws Exception {
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 = new InputStreamReader(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) throws Exception {
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 = new InputStreamReader(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  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值