android使用JSON进行网络数据交换_第1页
android使用JSON进行网络数据交换_第2页
android使用JSON进行网络数据交换_第3页
android使用JSON进行网络数据交换_第4页
android使用JSON进行网络数据交换_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、使用JSON进行网络数据交换网络编程,2009-12-1817:29:44标签:在开发客户端与服务端的应用当中,数据交换接口通常都是通过XML格式来进行数据交换的。近年来,随着AJAX技术的兴起,JSON作为一种轻量级的数据交换格式,以其易于阅读和编写的优点,也越来越多的被使用到各个项目中。在AndroidSDK中,也提供了JSON的类库方便对JSON格式的数据进行处理。本文将快速讲解JSON格式,并通过代码示例演示如何分另I在客户端和服务器端进行JSON格式数据的处理。什么是JSONJSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于阅读和编写,同时也

2、易于机器解析和生成,非常适合于服务器与客户端的交互。JSON采用与编程语言无关的文本格式,但是也使用了类C语言的习惯,这些特性使JSON成为理想的数据交换格式。和XML一样,JSON也是基于纯文本的数据格式。由于JSON天生是为JavaScript准备的,因此,JSON的数据格式非常简单,您可以用JSON传输一个简单的String,Number,Boolean,也可以传输一个数组,或者一个复杂的Object对象。String,Number和Boolean用JSON表示非常简单。例如,用JSON表示一个简单的字符串“abc,其格式为:"abc"。除了字符",/和一些

3、控制符(b,f,n,r,t)需要编码外,其他Unicode字符可以直接输出下图是一个String的完整表示结构:图I.String的完整表示结构一个Number可以根据整型或浮点数表示如下:图2.Number的表示结构这与绝大多数编程语言的表示方法一致,例如:12345(整数)-3.9e10(浮点数)Boolean类型表示为true或false。此夕卜,JavaScript中的null被表示为null,注意,true、false和null都没有双引号,否则将被视为一个String。JSON还可以表示一个数组对象,使用口包含所有元素,每个元素用逗号分隔,元素可以是任意的Value,例如,以下数组

4、包含了一个String,Number,Boolean和一个null:viewplaincopytoclipboardprint?1."abc",12345,false,nullObject对象在JSON中是用包含一系列无序的Key-Value键值对表示的,实际上此处的Object相当于Java中的Map<String,Object,而不是Java的Class。注意Key只能用String表示。例如,一个Address对象包含如下Key-Value:city:Beijingstreet:ChaoyangRoadpostcode:100025(整数)用JSON表示如下:v

5、iewplaincopytoclipboardprint?1. "city":"Beijing","street":"ChaoyangRoad","postcode":100025其中Value也可以是另一个Object或者数组,因此,复杂的Object可以嵌套表示,例如,一个Person对象包含name和address对象,可以表示如下:viewplaincopytoclipboardprint?2. "name":"Michael","add

6、ress":3. "city":"Beijing","street":"ChaoyangRoad","postcode":1000254. 一个实际例子接下来,我会通过一个例子来详细说明Android客户端程序如何访问服务端的接口程序读取用户列表数据,并在模拟器上显示用户列表数据。1、服务端接口程序首先,我们创建一个名为User的JavaBean作为用户对象类,用来保存演示数据。1.publicclassUser2.privateintid;3.privateStringname;4.

7、privateStringemail;5.privateStringgender;6.7.publicintgetId()8.returniid;9.10.publicvoidsetId(intid)11.this.id=id;12.13.publicStringgetName()14.returniname;15.16.publicvoidsetName(Stringname)17.=name;18.19.publicStringgetEmail()20.returniemail;21.22.publicvoidsetEmail(Stringemail)23.this.em

8、ail=email;24.25.publicStringgetGender()26.returnigender;27.28.publicvoidsetGender(Stringgender)29.this.gender=gender;30.31.32.在这个程序里,添加用户数据接下来,我们创建一个名为JSONDemoServlet的Servlet类来作为服务端的接口程序。定义了一个List对象用来保存用户列表。viewplaincopytoclipboardprint?1.privateList<User>list;客户端程序访问服务器端接口时,接口通过prepareData方法为

9、用户列表初始化数据,到List对象中。view plaincopy to clipboardprint?1.privatevoidprepareData()..10.list = new ArrayList<User>();User bean1 =new User();bean1.setId(bean1.setName(bean1.setEmail(bean1.setGender( list.add(bean1);1001 );"Tony");"tony""male"););接着遍历用户列表,把

10、列表中的每个Java用户对象转换为JSONObject对象,再加入到JSONArray中去。viewplaincopytoclipboardprint?1. JSONArrayarray=newJSONArray();2. for(Userbean:list)3. /单个用户JSON对象4. JSONObjectobj=newJSONObject();.3.14.5.tryobj.put("id",bean.getId();obj.put("name",bean.getName();obj.put("email

11、",bean.getEmail();obj.put("gender",bean.getGender();catch(Exceptione)array.put(obj);最后,通过Servlet输出JSON时,需要设置正确的MIME类型和字符编码。假定服务器使用UTF-8编码,则可以使用以下代码输出编码后的JSON文本:viewplaincopytoclipboardprint?1. response.setContentType("text/plain");2. response.setCharacterEncoding("UTF-8

12、");3. PrintWriterout=response.getWriter();4. out.write(array.toString();5. out.flush();6. out.close();7.8. JSONDemoServlet.java的完整代码如下:9. importjava.io.IOException;0. import11. importjava.io.PrintWriter;java.util.ArrayList;12.importjava.uti

13、l.List;13.14.importjavax.servlet.ServletException;15.importjavax.servlet.http.HttpServlet;16.importjavax.servlet.http.HttpServletRequest;17.importjavax.servlet.http.HttpServletResponse;18.19.importorg.json.JSONArray;20.importorg.json.JSONObject;21.22.publicclassJSONDemoServletextendsHttpServlet23.pr

14、ivatestaticfinallongserialVersionUID=-7368225680407826408L;24. privateList<User>list;25.26. /*27. *处理post方式提交的数据28. */29. publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOExceptiondoGet(request,response);/*出来get方式提交的数据*/publicvoiddoGet(HttpServlet

15、Requestrequest,HttpServletResponseresponse)throwsServletException,IOExceptionresponse.setContentType("text/plain");response.setCharacterEncoding("UTF-8");PrintWriterout=response.getWriter();/准备用户数据prepareData();/JSON数组JSONArrayarray=newJSONArray();for(Userbean:list)/单个用户JSON对象JSO

16、NObjectobj=newJSONObject();48.49.try50.obj.put("id",bean.getId();51.obj.put("name",bean.getName();52.obj.put("email",bean.getEmail();53.obj.put("gender",bean.getGender();54.catch(Exceptione)55.56.array.put(obj);57.58.59./输出60.out.write(array.toString();61.out.

17、flush();62.out.close();63.64.privatevoidprepareData()65.list=newArrayList<User>();66.Userbean1=newUser();67.bean1.setId(1001);68.bean1.setName("Tony");69.bean1.setEmail("tony");70.bean1.setGender("male");71.list.add(bean1);72.73.Userbean2=newUser();74.bean2.setId(

18、1002);75.bean2.setName("Jack");76.bean2.setEmail("jack");77.bean2.setGender("male");78.list.add(bean2);79.80.Userbean3=newUser();81.bean3.setId(1003);82.bean3.setName("Marry");83.bean3.setEmail("marry");84.bean3.setGender("female");85.list.

19、add(bean3);86.87.Userbean4=newUser();88.bean4.setId(1004);89.bean4.setName("Linda");90.bean4.setEmail("linda");91.female");bean4.setGender(92. list.add(bean4);93. 94. 把该Servlet部署到Tomcat下,在浏览器输入接口地址http:localhost:8080/article/JSONDemoServlet,输出结果如下:"id":1001,"e

20、mail":"tony","name":"Tony","gender":"male","id":1002,"email":"","name":"Jack","gender":"male","id":1003,"email":"marry","name

21、":"Marry","gender":"female","id":1004,"email":"linda","name":"Linda","gender":"female"2、手机客户端程序准备好服务端的接口后,接下来就是准备写客户端的程序了。打开Eclipse新建一个Android项目。我们创建一个名为MainActivity的Activity类,如下图所示:-JEOHDemaS网sr

22、c-由net.toeach.jsandemol+l|2jvity.java+LrjeiieratedJavFiles+iSAndroid1.5匚±assetsffi也resAAndrondNanifest.xml目perties因为要访问外部网络,所以要在AndroidManifest.xml文件里增加一行安全许可:<uses-permissionandroid:name="android.permission.INTERNET"/>这样我们的应用程序就可以访问网络了。接着修改布局文件reslayoutmain.xml,增加一个

23、TextView对象,用来显示解析后的用户数据viewplaincopytoclipboardprint?1. <?xmlversion="1.0"encoding="utf-8"?>2. <LinearLayoutxmlns:android="android"3. android:orientation="vertical"4. android:layout_width="f川_parent"5. android:layout_height="f川_parent&q

24、uot;>6. <TextViewandroid:id="+id/textView"7. android:layout_width="f川_parent"8. android:layout_height="f川_parent"/>9. </LinearLayout>AndroidSDK提供了Apache的HttpClient类处理网络访问,相信很多读者朋友都在其他项目当中用到过HttpClient。我写了一个方法,获取某一网址的网页内容,代码如下:viewplaincopytoclipboardprint

25、?.5.6.7./*获取网址内容* paramurl* return* throwsException*/privateStringgetContent(Stringurl)throwsException8. StringBuildersb=newStringBuilder();9.10. HttpClientclient=newDefaultHttpClient();11. HttpParamshttpParams=client.getParams();12. /设置网络超时参数13. HttpConnectionParams.setConnectionTimeout(http

26、Params,3000);14. HttpConnectionParams.setSoTimeout(httpParams,5000);15. HttpResponseresponse=client.execute(newHttpGet(url);16. HttpEntityentity=response.getEntity();17. if(entity!=null)18. BufferedReaderreader=newBufferedReader(newInputStreamReader(entity.getContent(),"UTF-8"),8192);19.20

27、. Stringline=null;21. while(line=reader.readLine()!=null)22. sb.append(line+"n");23. 24. reader.close();25.26.return sb. toString();27.修改MainActivity.java,在onCreate方法里增加解析服务端接口内容的代码,如下所示:viewplaincopytoclipboardprint?1. Override2. publicvoidonCreate(BundlesavedInstanceState)3. super.onCrea

28、te(savedInstanceState);4. setContentView(R.layout.main);5.6. try7. StringBuffersb=newStringBuffer();8. /在测试过程中,经常是用本机做测试服务器,访问本机的IP地址要设置为9.String url =":8080/article/JSONDemoServlet”30. 10.11. Stringbody=getContent(url);12.13.JSONArray array =new JSONArray(body);0.21.for

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论