`
andy_叶
  • 浏览: 67782 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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   

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics