大家好,今天给大家分享下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;
|
015 |
* @author frankiewei. |
018 |
public class JSONUtil {
|
019 |
private static final String TAG = "JSONUtil" ;
|
024 |
* @throws JSONException |
025 |
* @throws ConnectionException |
027 |
public static JSONObject getJSON(String url) throws JSONException, Exception {
|
028 |
return new JSONObject(getRequest(url));
|
031 |
* 向api发送get请求,返回从后台取得的信息。 |
036 |
protected static String getRequest(String url) throws Exception {
|
037 |
return getRequest(url, new DefaultHttpClient( new BasicHttpParams()));
|
040 |
* 向api发送get请求,返回从后台取得的信息。 |
046 |
protected static String getRequest(String url, DefaultHttpClient client) throws Exception {
|
047 |
String result = null ;
|
049 |
HttpGet getMethod = new HttpGet(url);
|
050 |
Log.d(TAG, "do the getRequest,url=" +url+ "" );
|
053 |
HttpResponse httpResponse = client.execute(getMethod); |
055 |
statusCode = httpResponse.getStatusLine().getStatusCode(); |
056 |
Log.d(TAG, "statuscode = " +statusCode);
|
058 |
result = retrieveInputStream(httpResponse.getEntity()); |
059 |
} catch (Exception e) {
|
060 |
Log.e(TAG, e.getMessage()); |
061 |
throw new Exception(e);
|
068 |
* 处理httpResponse信息,返回String |
073 |
protected static String retrieveInputStream(HttpEntity httpEntity) {
|
074 |
int length = ( int ) httpEntity.getContentLength();
|
077 |
if (length < 0 ) length = 10000 ;
|
078 |
StringBuffer stringBuffer = new StringBuffer(length);
|
080 |
InputStreamReader inputStreamReader = new InputStreamReader(httpEntity.getContent(), HTTP.UTF_8);
|
081 |
char buffer[] = new char [length];
|
083 |
while ((count = inputStreamReader.read(buffer, 0 , length - 1 )) > 0 ) {
|
084 |
stringBuffer.append(buffer, 0 , count);
|
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()); |
093 |
return stringBuffer.toString();
|
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;
|
110 |
* @author frankiewei. |
113 |
public class JSONUtil {
|
115 |
private static final String TAG = "JSONUtil" ;
|
121 |
* @throws JSONException |
122 |
* @throws ConnectionException |
124 |
public static JSONObject getJSON(String url) throws JSONException, Exception {
|
126 |
return new JSONObject(getRequest(url));
|
130 |
* 向api发送get请求,返回从后台取得的信息。 |
135 |
protected static String getRequest(String url) throws Exception {
|
136 |
return getRequest(url, new DefaultHttpClient( new BasicHttpParams()));
|
140 |
* 向api发送get请求,返回从后台取得的信息。 |
146 |
protected static String getRequest(String url, DefaultHttpClient client) throws Exception {
|
147 |
String result = null ;
|
149 |
HttpGet getMethod = new HttpGet(url);
|
150 |
Log.d(TAG, "do the getRequest,url=" +url+ "" );
|
153 |
HttpResponse httpResponse = client.execute(getMethod); |
155 |
statusCode = httpResponse.getStatusLine().getStatusCode(); |
156 |
Log.d(TAG, "statuscode = " +statusCode);
|
158 |
result = retrieveInputStream(httpResponse.getEntity()); |
159 |
} catch (Exception e) {
|
160 |
Log.e(TAG, e.getMessage()); |
161 |
throw new Exception(e);
|
169 |
* 处理httpResponse信息,返回String |
174 |
protected static String retrieveInputStream(HttpEntity httpEntity) {
|
176 |
int length = ( int ) httpEntity.getContentLength();
|
179 |
if (length < 0 ) length = 10000 ;
|
180 |
StringBuffer stringBuffer = new StringBuffer(length);
|
182 |
InputStreamReader inputStreamReader = new InputStreamReader(httpEntity.getContent(), HTTP.UTF_8);
|
183 |
char buffer[] = new char [length];
|
185 |
while ((count = inputStreamReader.read(buffer, 0 , length - 1 )) > 0 ) {
|
186 |
stringBuffer.append(buffer, 0 , count);
|
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()); |
195 |
return stringBuffer.toString();
|
编写主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 {
|
010 |
* 访问的后台地址,这里访问本地的不能用127.0.0.1应该用10.0.2.2 |
012 |
private static final String BASE_URL = "http://10.0.2.2:8080/index2.jsp" ;
|
013 |
private TextView mStudentTextView;
|
014 |
private TextView mClassTextView;
|
016 |
public void onCreate(Bundle savedInstanceState) {
|
017 |
super .onCreate(savedInstanceState);
|
018 |
setContentView(R.layout.main); |
024 |
private void setupViews(){
|
025 |
mStudentTextView = (TextView)findViewById(R.id.student); |
026 |
mClassTextView = (TextView)findViewById(R.id.classes); |
029 |
JSONObject mJsonObject = JSONUtil.getJSON(BASE_URL); |
031 |
JSONArray mJsonArray = mJsonObject.getJSONArray( "students" );
|
033 |
JSONObject firstStudent = mJsonArray.getJSONObject( 0 );
|
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) {
|
043 |
} catch (Exception e) {
|
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 {
|
057 |
* 访问的后台地址,这里访问本地的不能用127.0.0.1应该用10.0.2.2 |
059 |
private static final String BASE_URL = "http://10.0.2.2:8080/index2.jsp" ;
|
061 |
private TextView mStudentTextView;
|
063 |
private TextView mClassTextView;
|
067 |
public void onCreate(Bundle savedInstanceState) {
|
068 |
super .onCreate(savedInstanceState);
|
069 |
setContentView(R.layout.main); |
075 |
private void setupViews(){
|
076 |
mStudentTextView = (TextView)findViewById(R.id.student); |
077 |
mClassTextView = (TextView)findViewById(R.id.classes); |
081 |
JSONObject mJsonObject = JSONUtil.getJSON(BASE_URL); |
084 |
JSONArray mJsonArray = mJsonObject.getJSONArray( "students" );
|
086 |
JSONObject firstStudent = mJsonArray.getJSONObject( 0 );
|
088 |
String classes = mJsonObject.getString( "class" );
|
092 |
String studentInfo = classes + "共有 " + mJsonArray.length() + " 个学生."
|
093 |
+ "第一个学生姓名: " + firstStudent.getString( "name" )
|
094 |
+ " 年龄: " + firstStudent.getInt( "age" );
|
096 |
mStudentTextView.setText(studentInfo); |
098 |
mClassTextView.setText( "班级: " + classes);
|
099 |
} catch (JSONException e) {
|
101 |
} catch (Exception e) {
|
这里用到的布局文件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" >
|
07 |
android:id= "@+id/student"
|
08 |
android:layout_width= "fill_parent"
|
09 |
android:layout_height= "wrap_content"
|
10 |
android:text= "@string/hello" />
|
12 |
android:id= "@+id/classes"
|
13 |
android:layout_width= "fill_parent"
|
14 |
android:layout_height= "wrap_content"
|
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" >
|
23 |
android:id= "@+id/student"
|
24 |
android:layout_width= "fill_parent"
|
25 |
android:layout_height= "wrap_content"
|
26 |
android:text= "@string/hello" />
|
28 |
android:id= "@+id/classes"
|
29 |
android:layout_width= "fill_parent"
|
30 |
android:layout_height= "wrap_content"
|
最后要在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>
|
08 |
android:icon= "@drawable/ic_launcher"
|
09 |
android:label= "@string/app_name" >
|
11 |
android:name= ".JSONDemoActivity"
|
12 |
android:label= "@string/app_name" >
|
14 |
<action android:name= "android.intent.action.MAIN" />
|
15 |
<category android:name= "android.intent.category.LAUNCHER" />
|
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>
|
27 |
android:icon= "@drawable/ic_launcher"
|
28 |
android:label= "@string/app_name" >
|
30 |
android:name= ".JSONDemoActivity"
|
31 |
android:label= "@string/app_name" >
|
33 |
<action android:name= "android.intent.action.MAIN" />
|
34 |
<category android:name= "android.intent.category.LAUNCHER" />
|
分享到:
相关推荐
二、Android解析JSON的库 在Android中,我们通常使用以下两个库进行JSON解析: 1. `org.json`:Android SDK自带的JSON解析库,轻量级且简单易用,适用于简单的JSON解析。 2. `Gson`:Google提供的一个Java库,可以...
本教程可能会涵盖使用HttpURLConnection、OkHttp或Volley库发送网络请求,以及如何解析和处理返回的JSON数据。 四、多线程 Android应用中的长时间运行操作应放在后台线程中执行,以避免阻塞主线程导致应用无响应。...
以上就是Android解析JSON数据的主要方法,可以根据项目需求选择合适的方式。在实际开发中,通常会结合网络请求库(如Volley、Retrofit)和JSON解析库(如Gson)来实现数据的获取和解析。同时,为了提高用户体验,...
本实例将带你通过Android Studio实现一个仿拼多多砍价页面,这涉及到多个Android开发的关键知识点,包括布局设计、用户交互、数据存储以及网络请求。 首先,我们来看一下项目的基本结构: 1. **gradlew.bat** 和 *...
3. 网络通信:Android应用经常需要与服务器进行数据交换,"网络请求"实例可能涵盖使用HttpURLConnection、OkHttp或Retrofit等库发起HTTP请求,处理JSON或XML响应数据。 4. 多媒体处理:Android支持音频、视频播放和...
- **JSON解析**: 数据以JSON格式返回,使用Gson或Jackson库将JSON字符串转化为Java对象。 3. **布局设计** - **XML布局文件**: 使用XML定义UI元素,如TextView、ImageView等,通过findViewById()方法在代码中引用...
"android 实例源码 集合" 提供了多种Android应用程序的源代码,这为我们提供了宝贵的参考资源,帮助开发者深入理解Android应用开发的各种技术点。下面将详细解析这个集合中的关键知识点。 1. **Activity与Intent**...
实例可能包括使用HttpURLConnection、OkHttp或Retrofit库进行网络请求,以及处理JSON或XML数据的解析。 五、异步处理与线程管理 Android应用的主线程负责UI更新,因此网络请求、数据库操作等耗时任务应在其他线程中...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,常用于服务器与客户端之间交换数据。 接口开发则涉及到如何设计和实现与手机客户端交互的API。例如...
在“精选Android应用实例”这个压缩包中,我们很可能会找到一系列有关Android应用程序开发的源代码实例。这些实例是开发者们在实践中提炼出来的经典案例,旨在帮助初学者和有经验的开发者更好地理解和掌握Android...
6. **Ch08**和**Ch09**: 这些章节可能深入到网络编程,如使用HttpURLConnection或OkHttp进行网络请求,理解JSON数据解析,以及如何使用WebSocket进行实时通信。也可能涉及Android的异步处理,如AsyncTask和Loader。 ...
在Android实例开发中,完全手册通常会涵盖一系列的实践教程,旨在帮助开发者深入理解平台的工作原理,提升开发技能。这个“android实例开发完全手册光盘”包含了一系列的源代码,覆盖了不同的主题和应用场景,这对于...
Douban API通常返回JSON格式的数据,我们需要将其解析成Java对象。Gson库可以帮助我们轻松完成这个任务。创建对应的Java模型类,Gson能将JSON字符串转换为对象,反之亦然。 六、异步操作 由于Android主线程不允许...
同时,JSON作为常见的数据交换格式,开发者需要学会解析JSON数据,将接收到的数据绑定到UI元素上。例如,可以使用Gson或Jackson库进行自动解析。 六、权限管理 Android 6.0及以上版本引入了运行时权限管理,开发者...
《Android开发实例大全 第2版》是一本专为Android开发者准备的实践指南,全面涵盖了Android应用开发的各种核心技术和实战技巧。这本书旨在帮助读者通过实际案例深入理解Android平台的开发过程,提升开发技能。 首先...
《Google Android SDK开发范例大全》是一本专为Android开发者设计的实践教程,旨在通过丰富的实例帮助读者深入理解和掌握Android应用程序开发。这本书于2009年7月首次出版,对于当时的开发者来说,是了解Android SDK...
11. **JSON解析**:学习如何解析和序列化JSON数据,常用库如Gson、Jackson或Android自带的JSON库。 12. **权限管理**:掌握Android的运行时权限机制,如何在API 23及以上版本中请求和管理权限。 13. **碎片...
AsyncTask是Android提供的轻量级异步任务框架,它包含三个泛型参数:Params(输入参数)、Progress(后台进度更新参数)、Result(返回结果)。在ListView的异步加载图片场景中,Params通常为网络图片URL,Result为...
《Android编程典型实例与项目开发源码》是吴亚峰编著的一本深入浅出的Android开发教程,书中涵盖了从基础到进阶的各种实例和项目。通过对这些源码的学习,开发者可以快速掌握Android应用程序设计的核心技能。以下是...
在深入到Android的事件处理和多线程之后,本书还将讲解网络通信技术,如HTTP请求、WebSocket、JSON解析以及使用 Volley 和 Retrofit 进行网络数据交互。对于现代Android开发,网络功能是不可或缺的部分。 此外,书...