版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Good is good, but better carries it.精益求精,善益求善。android使用JSON进行网络数据交换-使用JSON进行网络数据交换网络编程,2009-12-1817:29:44标签:在开发客户端与服务端的应用当中,数据交换接口通常都是通过XML格式来进行数据交换的。近年来,随着AJAX技术的兴起,JSON作为一种轻量级的数据交换格式,以其易于阅读和编写的优点,也越来越多的被使用到各个项目中。在AndroidSDK中,也提供了JSON的类库方便对JSON格式的数据进行处理。本文将快速讲解JSON格式,并通过代码示例演示如何分别在客户端和服务器端进行JSON格式数
2、据的处理。什么是JSONJSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成,非常适合于服务器与客户端的交互。JSON采用与编程语言无关的文本格式,但是也使用了类C语言的习惯,这些特性使JSON成为理想的数据交换格式。和XML一样,JSON也是基于纯文本的数据格式。由于JSON天生是为JavaScript准备的,因此,JSON的数据格式非常简单,您可以用JSON传输一个简单的String,Number,Boolean,也可以传输一个数组,或者一个复杂的Object对象。String,Number和Boolean用JSO
3、N表示非常简单。例如,用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还可以
4、表示一个数组对象,使用包含所有元素,每个元素用逗号分隔,元素可以是任意的Value,例如,以下数组包含了一个String,Number,Boolean和一个null:HYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9viewplainHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9copytoclipboardHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC
5、65C50F7FA73B558E9printHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9?abc,12345,false,nullabc,12345,false,nullObject对象在JSON中是用包含一系列无序的Key-Value键值对表示的,实际上此处的Object相当于Java中的Map,而不是Java的Class。注意Key只能用String表示。例如,一个Address对象包含如下Key-Value:city:Beijingstreet:ChaoyangRoadpostcode:100
6、025(整数)用JSON表示如下:HYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9viewplainHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9copytoclipboardHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9printHYPERLINK/article/show/129;jsessionid=B5B61D
7、9FD03EDDC65C50F7FA73B558E9?city:Beijing,street:ChaoyangRoad,postcode:100025city:Beijing,street:ChaoyangRoad,postcode:100025其中Value也可以是另一个Object或者数组,因此,复杂的Object可以嵌套表示,例如,一个Person对象包含name和address对象,可以表示如下:HYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9viewplainHYPERLINK/article
8、/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9copytoclipboardHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9printHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9?name:Michael,address:city:Beijing,street:ChaoyangRoad,postcode:100025name:Michael,addr
9、ess:city:Beijing,street:ChaoyangRoad,postcode:100025一个实际例子接下来,我会通过一个例子来详细说明Android客户端程序如何访问服务端的接口程序读取用户列表数据,并在模拟器上显示用户列表数据。1、服务端接口程序首先,我们创建一个名为User的JavaBean作为用户对象类,用来保存演示数据。HYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9viewplainHYPERLINK/article/show/129;jsessionid=B5B61D9FD0
10、3EDDC65C50F7FA73B558E9copytoclipboardHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9printHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9?publicclassUserprivateintid;privateStringname;privateStringemail;privateStringgender;publicintgetId()returnid;publicv
11、oidsetId(intid)this.id=id;publicStringgetName()returnname;publicvoidsetName(Stringname)=name;publicStringgetEmail()returnemail;publicvoidsetEmail(Stringemail)this.email=email;publicStringgetGender()returngender;publicvoidsetGender(Stringgender)this.gender=gender;publicclassUserprivateintid;privateSt
12、ringname;privateStringemail;privateStringgender;publicintgetId()returnid;publicvoidsetId(intid)this.id=id;publicStringgetName()returnname;publicvoidsetName(Stringname)=name;publicStringgetEmail()returnemail;publicvoidsetEmail(Stringemail)this.email=email;publicStringgetGender()returngender;publicvoi
13、dsetGender(Stringgender)this.gender=gender;接下来,我们创建一个名为JSONDemoServlet的Servlet类来作为服务端的接口程序。在这个程序里,定义了一个List对象用来保存用户列表。HYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9viewplainHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9copytoclipboardHYPERLINK/article/
14、show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9printHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9?privateListlist;privateListlist;客户端程序访问服务器端接口时,接口通过prepareData方法为用户列表初始化数据,添加用户数据到List对象中。HYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9viewplainHYP
15、ERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9copytoclipboardHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9printHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9?privatevoidprepareData()list=newArrayList();Userbean1=newUser();bean1.se
16、tId(1001);bean1.setName(Tony);bean1.setEmail(tony);bean1.setGender(male);list.add(bean1);privatevoidprepareData()list=newArrayList();Userbean1=newUser();bean1.setId(1001);bean1.setName(Tony);bean1.setEmail(tony);bean1.setGender(male);list.add(bean1);接着遍历用户列表,把列表中的每个Java用户对象转换为JSONObject对象,再加入到JSONAr
17、ray中去。HYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9viewplainHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9copytoclipboardHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9printHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65
18、C50F7FA73B558E9?JSONArrayarray=newJSONArray();for(Userbean:list)/单个用户JSON对象JSONObjectobj=newJSONObject();tryobj.put(id,bean.getId();obj.put(name,bean.getName();obj.put(email,bean.getEmail();obj.put(gender,bean.getGender();catch(Exceptione)array.put(obj);JSONArrayarray=newJSONArray();for(Userbean:lis
19、t)/单个用户JSON对象JSONObjectobj=newJSONObject();tryobj.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文本:HYPERLINK/article/show/129;jsess
20、ionid=B5B61D9FD03EDDC65C50F7FA73B558E9viewplainHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9copytoclipboardHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9printHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9?response.setContentTyp
21、e(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.ServletExceptio
22、n;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.json.JSONArray;importorg.json.JSONObject;publicclassJSONDemoServletextendsHttpServletprivatestaticfinallongserialVersionUID=-7368225680407826408L;privateListlist;
23、/*处理post方式提交的数据*/publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOExceptiondoGet(request,response);/*出来get方式提交的数据*/publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOExceptionresponse.setContentType(text/plain
24、);response.setCharacterEncoding(UTF-8);PrintWriterout=response.getWriter();/准备用户数据prepareData();/JSON数组JSONArrayarray=newJSONArray();for(Userbean:list)/单个用户JSON对象JSONObjectobj=newJSONObject();tryobj.put(id,bean.getId();obj.put(name,bean.getName();obj.put(email,bean.getEmail();obj.put(gender,bean.get
25、Gender();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.
26、setName(Jack);bean2.setEmail(jack);bean2.setGender(male);list.add(bean2);Userbean3=newUser();bean3.setId(1003);bean3.setName(Marry);bean3.setEmail();bean3.setGender(female);list.add(bean3);Userbean4=newUser();bean4.setId(1004);bean4.setName(Linda);bean4.setEmail(linda21);bean4.setGender(female);list
27、.add(bean4);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;i
28、mportjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.json.JSONArray;importorg.json.JSONObject;publicclassJSONDemoServletextendsHttpServletprivatestaticfinallongserialVersionUID=-736
29、8225680407826408L;privateListlist;/*处理post方式提交的数据*/publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOExceptiondoGet(request,response);/*出来get方式提交的数据*/publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException
30、response.setContentType(text/plain);response.setCharacterEncoding(UTF-8);PrintWriterout=response.getWriter();/准备用户数据prepareData();/JSON数组JSONArrayarray=newJSONArray();for(Userbean:list)/单个用户JSON对象JSONObjectobj=newJSONObject();tryobj.put(id,bean.getId();obj.put(name,bean.getName();obj.put(email,bean.
31、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=
32、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();bean3.setGender(female);list.add(bean3);Userbean4=newUser();bean4.setId(1004);bean4.setName(Linda);bean4.setEmail(lin
33、da21);bean4.setGender(female);list.add(bean4);把该Servlet部署到Tomcat下,在浏览器输入接口地址HYPERLINKhttp:/localhost:8080/article/JSONDemoServlethttp:/localhost:8080/article/JSONDemoServlet,输出结果如下:id:1001,email:HYPERLINKmailto:tony%22,%22name%22:%22Tony%22,%22gender%22:%22male%22%7d,%7b%22id%22:1002,%22email%22:%22
34、jack%22,%22name%22:%22Jack%22,%22gender%22:%22male%22%7d,%7b%22id%22:1003,%22email%22:%22,%22name%22:%22Marry%22,%22gender%22:%22female%22%7d,%7b%22id%22:1004,%22email%22:%22linda21%22,%22name%22:%22Linda%22,%22gender%22:%22femaletony,name:Tony,gender:male,id:1002,email:jack,name:Jack,gender:male,id
35、:1003,email:,name:Marry,gender:female,id:1004,email:linda21,name:Linda,gender:female2、手机客户端程序准备好服务端的接口后,接下来就是准备写客户端的程序了。打开Eclipse新建一个Android项目。我们创建一个名为MainActivity的Activity类,如下图所示:因为要访问外部网络,所以要在AndroidManifest.xml文件里增加一行安全许可:这样我们的应用程序就可以访问网络了。接着修改布局文件reslayoutmain.xml,增加一个TextView对象,用来显示解析后的用户数据。HYP
36、ERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9viewplainHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9copytoclipboardHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9printHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73
37、B558E9?AndroidSDK提供了Apache的HttpClient类处理网络访问,相信很多读者朋友都在其他项目当中用到过HttpClient。我写了一个方法,获取某一网址的网页内容,代码如下:HYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9viewplainHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9copytoclipboardHYPERLINK/article/show/129;jsessioni
38、d=B5B61D9FD03EDDC65C50F7FA73B558E9printHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9?/*获取网址内容*paramurl*return*throwsException*/privateStringgetContent(Stringurl)throwsExceptionStringBuildersb=newStringBuilder();HttpClientclient=newDefaultHttpClient();HttpParamshttpParams=cli
39、ent.getParams();/设置网络超时参数HttpConnectionParams.setConnectionTimeout(httpParams,3000);HttpConnectionParams.setSoTimeout(httpParams,5000);HttpResponseresponse=client.execute(newHttpGet(url);HttpEntityentity=response.getEntity();if(entity!=null)BufferedReaderreader=newBufferedReader(newInputStreamReader
40、(entity.getContent(),UTF-8),8192);Stringline=null;while(line=reader.readLine()!=null)sb.append(line+n);reader.close();returnsb.toString();/*获取网址内容*paramurl*return*throwsException*/privateStringgetContent(Stringurl)throwsExceptionStringBuildersb=newStringBuilder();HttpClientclient=newDefaultHttpClien
41、t();HttpParamshttpParams=client.getParams();/设置网络超时参数HttpConnectionParams.setConnectionTimeout(httpParams,3000);HttpConnectionParams.setSoTimeout(httpParams,5000);HttpResponseresponse=client.execute(newHttpGet(url);HttpEntityentity=response.getEntity();if(entity!=null)BufferedReaderreader=newBuffere
42、dReader(newInputStreamReader(entity.getContent(),UTF-8),8192);Stringline=null;while(line=reader.readLine()!=null)sb.append(line+n);reader.close();returnsb.toString();修改MainActivity.java,在onCreate方法里增加解析服务端接口内容的代码,如下所示:HYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9viewplainHYP
43、ERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9copytoclipboardHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9printHYPERLINK/article/show/129;jsessionid=B5B61D9FD03EDDC65C50F7FA73B558E9?OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025国电投(河南)新动力科技有限公司招聘14人笔试历年典型考点题库附带答案详解试卷3套
- 2025中铁十九局集团有限公司校园招聘笔试历年备考题库附带答案详解试卷3套
- 固废分类与回收系统建设方案
- 福建公务员考试公务员试题及答案
- 管网建设中的环境影响评估与治理方案
- 市政路网及配套设施工程施工方案
- 财会公务员考试真题卷试题及答案
- 滨海公务员考试行测试题及答案
- 北京区级公务员考试真题试题及答案
- 安庆公务员考试考场试题及答案
- 锂电池pack工厂安全培训课件
- 防雷减灾安全知识培训课件
- 《慢加急性肝衰竭诊治指南(2025年版)》解读课件
- (2025秋新版)青岛版科学三年级上册全册教案
- 腔镜甲状腺手术课件
- 急造军路路面课件
- 新能源重卡产品知识培训课件
- 单杠教学课件下载
- 2025年中国邮政招聘笔试参考题库含答案解析
- 压铸铝合金工艺知识培训课件
- 青稞高产栽培技术培训教案
评论
0/150
提交评论