使用JSON进行网络数据交换传输 详细.docx
《使用JSON进行网络数据交换传输 详细.docx》由会员分享,可在线阅读,更多相关《使用JSON进行网络数据交换传输 详细.docx(10页珍藏版)》请在冰豆网上搜索。
![使用JSON进行网络数据交换传输 详细.docx](https://file1.bdocx.com/fileroot1/2022-12/11/2ab98295-2031-4399-b013-015a3419b338/2ab98295-2031-4399-b013-015a3419b3381.gif)
使用JSON进行网络数据交换传输详细
使用JSON进行网络数据交换-Android
2011年05月11日星期三15:
04
在开发客户端与服务端的应用当中,数据交换接口通常都是通过XML格式来进行数据交换的。
近年来,随着AJAX技术的兴起,JSON作为一种轻量级的数据交换格式,以其易于阅读和编写的优点,也越来越多的被使用到各个项目中。
在OPhoneSDK中,也提供了JSON的类库方便对JSON格式的数据进行处理。
本文将快速讲解JSON格式,并通过代码示例演示如何分别在客户端和服务器端进行JSON格式数据的处理。
什么是JSON
JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成,非常适合于服务器与客户端的交互。
JSON采用与编程语言无关的文本格式,但是也使用了类C语言的习惯,这些特性使JSON成为理想的数据交换格式。
和XML一样,JSON也是基于纯文本的数据格式。
由于JSON天生是为JavaScript准备的,因此,JSON的数据格式非常简单,您可以用JSON传输一个简单的String,Number,Boolean,也可以传输一个数组,或者一个复杂的Object对象。
String,Number和Boolean用JSON表示非常简单。
例如,用JSON表示一个简单的字符串“abc”,其格式为:
"abc"。
除了字符",\,/和一些控制符(\b,\f,\n,\r,\t)需要编码外,其他Unicode字符可以直接输出。
下图是一个String的完整表示结构:
图1.String的完整表示结构
一个Number可以根据整型或浮点数表示如下:
图2.Number的表示结构
这与绝大多数编程语言的表示方法一致,例如:
12345(整数)
-3.9e10(浮点数)
Boolean类型表示为true或false。
此外,JavaScript中的null被表示为null,注意,true、false和null都没有双引号,否则将被视为一个String。
JSON还可以表示一个数组对象,使用[]包含所有元素,每个元素用逗号分隔,元素可以是任意的Value,例如,以下数组包含了一个String,Number,Boolean和一个null:
Object对象在JSON中是用{}包含一系列无序的Key-Value键值对表示的,实际上此处的Object相当于Java中的Map,而不是Java的Class。
注意Key只能用String表示。
例如,一个Address对象包含如下Key-Value:
city:
Beijing
street:
ChaoyangRoad
postcode:
100025(整数)
用JSON表示如下:
{"city":
"Beijing","street":
"ChaoyangRoad","postcode":
100025}
{"city":
"Beijing","street":
"ChaoyangRoad","postcode":
100025}
其中Value也可以是另一个Object或者数组,因此,复杂的Object可以嵌套表示,例如,一个Person对象包含name和address对象,可以表示如下:
{"name":
"Michael","address":
{"city":
"Beijing","street":
"ChaoyangRoad","postcode":
100025} }
{"name":
"Michael","address":
{"city":
"Beijing","street":
"ChaoyangRoad","postcode":
100025}}
一个实际例子
接下来,我会通过一个例子来详细说明OPhone客户端程序如何访问服务端的接口程序读取用户列表数据,并在模拟器上显示用户列表数据。
1、服务端接口程序
首先,我们创建一个名为User的JavaBean作为用户对象类,用来保存演示数据。
publicclassUser{
privateintid;
privateStringname;
privateStringemail;
privateStringgender;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetEmail(){
returnemail;
}
publicvoidsetEmail(Stringemail){
this.email=email;
}
publicStringgetGender(){
returngender;
}
publicvoidsetGender(Stringgender){
this.gender=gender;
}
}
接下来,我们创建一个名为JSONDemoServlet的Servlet类来作为服务端的接口程序。
在这个程序里,定义了一个List对象用来保存用户列表。
privateListlist;
客户端程序访问服务器端接口时,接口通过prepareData方法为用户列表初始化数据,添加用户数据到List对象中。
privatevoidprepareData(){
list=newArrayList();
Userbean1=newUser();
bean1.setId(1001);
bean1.setName("Tony");
bean1.setEmail("tony@");
bean1.setGender("male");
list.add(bean1);
……
}
接着遍历用户列表,把列表中的每个Java用户对象转换为JSONObject对象,再加入到JSONArray中去。
JSONArrayarray=newJSONArray();
for(Userbean:
list){
//单个用户JSON对象
JSONObjectobj=newJSONObject();
try{
obj.put("id",bean.getId());
obj.put("name",bean.getName());
obj.put("email",bean.getEmail());
obj.put("gender",bean.getGender());
}catch(Exceptione){}
array.put(obj);
}
最后,通过Servlet输出JSON时,需要设置正确的MIME类型和字符编码。
假定服务器使用UTF-8编码,则可以使用以下代码输出编码后的JSON文本:
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
PrintWriterout=response.getWriter();
out.write(array.toString());
out.flush();
out.close();
JSONDemoServlet.java的完整代码如下:
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.util.ArrayList;
importjava.util.List;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.json.JSONArray;
importorg.json.JSONObject;
publicclassJSONDemoServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=-7368225680407826408L;
privateListlist;
/**
*处理post方式提交的数据
*/
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
doGet(request,response);
}
/**
*出来get方式提交的数据
*/
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
PrintWriterout=response.getWriter();
//准备用户数据
prepareData();
//JSON数组
JSONArrayarray=newJSONArray();
for(Userbean:
list){
//单个用户JSON对象
JSONObjectobj=newJSONObject();
try{
obj.put("id",bean.getId());
obj.put("name",bean.getName());
obj.put("email",bean.getEmail());
obj.put("gender",bean.getGender());
}catch(Exceptione){}
array.put(obj);
}
//输出
out.write(array.toString());
out.flush();
out.close();
}
privatevoidprepareData(){
list=newArrayList();
Userbean1=newUser();
bean1.setId(1001);
bean1.setName("Tony");
bean1.setEmail("tony@");
bean1.setGender("male");
list.add(bean1);
Userbean2=newUser();
bean2.setId(1002);
bean2.setName("Jack");
bean2.setEmail("jack@");
bean2.setGender("male");
list.add(bean2);
Userbean3=newUser();
bean3.setId(1003);
bean3.setName("Marry");
bean3.setEmail("marry@");
bean3.setGender("female");
list.add(bean3);
Userbean4=newUser();
bean4.setId(1004);
bean4.setName("Linda");
bean4.setEmail("linda@");
bean4.setGender("female");
list.add(bean4);
}
}
把该Servlet部署到Tomcat下,在浏览器输入接口地址http:
//localhost:
8080/article/JSONDemoServlet,输出结果如下:
[{"id":
1001,"email":
"[url=mailto:
tony@%22,%22name%22:
%22Tony%22,%22gender%22:
%22male%22%7D,%7B%22id%22:
1002,%22email%22:
%22jack@%22,%22name%22:
%22Jack%22,%22gender%22:
%22male%22%7D,%7B%22id%22:
1003,%22email%22:
%22marry@%22,%22name%22:
%22Marry%22,%22gender%22:
%22female%22%7D,%7B%22id%22:
1004,%22email%22:
%22linda@%22,%22name%22:
%22Linda%22,%22gender%22:
%22female]tony@","name":
"Tony","gender":
"male"},{"id":
1002,"email":
"jack@","name":
"Jack","gender":
"male"},{"id":
1003,"email":
"marry@","name":
"Marry","gender":
"female"},{"id":
1004,"email":
"linda@","name":
"Linda","gender":
"female[/url]"}]
2、手机客户端程序
准备好服务端的接口后,接下来就是准备写客户端的程序了。
打开Eclipse新建一个OPhone项目。
我们创建一个名为MainActivity的Activity类,如下图所示:
因为要访问外部网络,所以要在AndroidManifest.xml文件里增加一行安全许可:
name="android.permission.INTERNET"/>
这样我们的应用程序就可以访问网络了。
接着修改布局文件res\layout\main.xml,增加一个TextView对象,用来显示解析后的用户数据
xmlversion="1.0"encoding="utf-8"?
>
android="
android:
orientation="vertical"
android:
layout_width="fill_parent"
android:
layout_height="fill_parent">
id="@+id/textView"
android:
layout_width="fill_parent"
android:
layout_height="fill_parent"/>
OPhoneSDK提供了Apache的HttpClient类处理网络访问,相信很多读者朋友都在其他项目当中用到过HttpClient。
我写了一个方法,获取某一网址的网页内容,代码如下:
/**
*获取网址内容
*@paramurl
*@return
*@throwsException
*/
privateStringgetContent(Stringurl)throwsException{
StringBuildersb=newStringBuilder();
HttpClientclient=newDefaultHttpClient();
HttpParamshttpParams=client.getParams();
//设置网络超时参数
HttpConnectionParams.setConnectionTimeout(httpParams,3000);
HttpConnectionParams.setSoTimeout(httpParams,5000);
HttpResponseresponse=client.execute(newHttpGet(url));
HttpEntityentity=response.getEntity();
if(entity!
=null){
BufferedRe