使用JSON進行網(wǎng)絡(luò)數(shù)據(jù)交換傳輸 詳細_第1頁
使用JSON進行網(wǎng)絡(luò)數(shù)據(jù)交換傳輸 詳細_第2頁
使用JSON進行網(wǎng)絡(luò)數(shù)據(jù)交換傳輸 詳細_第3頁
使用JSON進行網(wǎng)絡(luò)數(shù)據(jù)交換傳輸 詳細_第4頁
使用JSON進行網(wǎng)絡(luò)數(shù)據(jù)交換傳輸 詳細_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

使用JSON進行網(wǎng)絡(luò)數(shù)據(jù)交換-Android2011年05月11日星期三15:04在開發(fā)客戶端與服務(wù)端的應(yīng)用當中,數(shù)據(jù)交換接口通常都是通過XML格式來進行數(shù)據(jù)交換的。近年來,隨著AJAX技術(shù)的興起,JSON作為一種輕量級的數(shù)據(jù)交換格式,以其易于閱讀和編寫的優(yōu)點,也越來越多的被使用到各個項目中。在OPhoneSDK中,也提供了JSON的類庫方便對JSON格式的數(shù)據(jù)進行處理。本文將快速講解JSON格式,并通過代碼示例演示如何分別在客戶端和服務(wù)器端進行JSON格式數(shù)據(jù)的處理。什么是JSONJSON(JavaScriptObjectNotation)是一種輕量級的數(shù)據(jù)交換格式,易于閱讀和編寫,同時也易于機器解析和生成,非常適合于服務(wù)器與客戶端的交互。JSON采用與編程語言無關(guān)的文本格式,但是也使用了類C語言的習(xí)慣,這些特性使JSON成為理想的數(shù)據(jù)交換格式。和XML一樣,JSON也是基于純文本的數(shù)據(jù)格式。由于JSON天生是為JavaScript準備的,因此,JSON的數(shù)據(jù)格式非常簡單,您可以用JSON傳輸一個簡單的String,Number,Boolean,也可以傳輸一個數(shù)組,或者一個復(fù)雜的Object對象。String,Number和Boolean用JSON表示非常簡單。例如,用JSON表示一個簡單的字符串“abc,”其格式為:"abc"。除了字符",\,除了字符",\,/和一些控制符(\b,\f,\n,\r,\t)需要編碼外,其他Unicode字符可以直接輸出。下圖是一個String的完整表示結(jié)構(gòu):圖1.String的完整表示結(jié)構(gòu)一個Number可以根據(jù)整型或浮點數(shù)表示如下:/iGr/zoittdltabsfrincr圖2.Number的表示結(jié)構(gòu)這與絕大多數(shù)編程語言的表示方法一致,例如:12345(整數(shù))-3.9e10(浮點數(shù))Boolean類型表示為true或false。此外,JavaScript中的null被表示為null,注意,true、false和null都沒有雙引號,否則將被視為一個String。JSON還可以表示一個數(shù)組對象,使用[]包含所有元素,每個元素用逗號分隔,元素可以是任意的Value,例如,以下數(shù)組包含了一個String,Number,Boolean和一個null:丄.[,cabc,,J12345J-fal£eJnulll[當制代碼Object對象在JSON中是用{}包含一系列無序的Key-Value鍵值對表示的,實際上此處的Object相當于Java中的MapvString,Object>,而不是Java的Class。注意Key只能用String表示。例如,一個Address對象包含如下Key-Value:city:Beijingstreet:ChaoyangRoadpostcode:100025(整數(shù))用JSON表示如下:{"city":"Beijing","street":"ChaoyangRoad","postcode":100025}}}{"city":"Beijing","street":"ChaoyangRoad","postcode":100025}其中Value也可以是另一個Object或者數(shù)組,因此,復(fù)雜的Object可以嵌套表示例如,一個Person對象包含name和address對象,可以表示如下:{"name":"Michael","address":{"city":"Beijing","street":"ChaoyangRoad","postcode":100025}}{"name":"Michael","address":{"city":"Beijing","street":"ChaoyangRoad","postcode":100025}}一個實際例子接下來,我會通過一個例子來詳細說明OPhone客戶端程序如何訪問服務(wù)端的接口程序讀取用戶列表數(shù)據(jù),并在模擬器上顯示用戶列表數(shù)據(jù)。1、服務(wù)端接口程序首先,我們創(chuàng)建一個名為User的JavaBean作為用戶對象類,用來保存演示數(shù)據(jù)publicclassUser{privateintid;privateStringname;privateStringemail;privateStringgender;publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}publicStringgetEmail(){returnemail;publicvoidsetEmail(Stringemail){this.email=email;}publicStringgetGender(){returngender;}publicvoidsetGender(Stringgender){this.gender=gender;}}接下來,我們創(chuàng)建一個名為JSONDemoServlet的Servlet類來作為服務(wù)端的接口程序。在這個程序里,定義了一個List對象用來保存用戶列表。privateListvUser>list;客戶端程序訪問服務(wù)器端接口時,接口通過prepareData方法為用戶列表初始化數(shù)據(jù),添加用戶數(shù)據(jù)到List對象中。privatevoidprepareData(){list=newArrayListvUser>();Userbean1=newUser();bean1.setId(1001);bean1.setName("Tony");bean1.setEmail("tony@");bean1.setGender("male");list.add(bean1);}接著遍歷用戶列表,把列表中的每個Java用戶對象轉(zhuǎn)換為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時,需要設(shè)置正確的MIME類型和字符編碼。假定服務(wù)器使用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;privateList<User>list;*處理post方式提交的數(shù)據(jù)*/publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(request,response);/***出來get方式提交的數(shù)據(jù)*/publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/plain");response.setCharacterEncoding("UTF-8");PrintWriterout=response.getWriter();//準備用戶數(shù)據(jù)prepareData();//JSON數(shù)組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<User>();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@163.com");bean3.setGender("female");list.add(bean3);Userbean4=newUser();bean4.setId(1004);bean4.setName("Linda");bean4.setEmail("linda@21");

bean4.setGender("female");list.add(bean4);}}把該Servlet部署到Tomcat下,在瀏覽器輸入接口地址http://localhost:8080/article/JSONDemoServlet,輸出結(jié)果如下:[{"id":1001,"email":"[url=mailto:tony@%22,%22name%22:%22Tony%22,%22gender%22:%22male%22%7D,%7B%22id%22:1002,%22email%22:%2jck@%22,%22name%22:%22Jack%22,%22gender%22:%22male%22%7D,%7B%22id%22:1003,%22email%22:%22marry@163.com%22,%22name%22:%22Marry%22,%22gender%22:%22female%22%7D,%7B%22id%22:1004,%22email%22:%22linda@21%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@163.com","name":"Marry","gender":"female"},{"id":1004,"email":"linda@21","name":"Linda","gender":"female[/url]"}]2、手機客戶端程序準備好服務(wù)端的接口后,接下來就是準備寫客戶端的程序了。打開Eclipse新建一個OPhone項目。我們創(chuàng)建一個名為MainActivity的Activity類,如下圖所示:-JSOHDemoffinet.toeach.jzoiLiiemLi+[2M:=iitlActivlty.jwag&n[Gent:r:i+H.lJ~avaFlies]<i1.5!一^|!一^|.ArnL:-■:<1ilH:itli£est.xmldet:nJ_t、propertiez因為要訪問外部網(wǎng)絡(luò),所以要在AndroidManifest.xml文件里增加一行安全許可:<uses-permissionandroid:name="android.permission.INTERNET"/>這樣我們的應(yīng)用程序就可以訪問網(wǎng)絡(luò)了。接著修改布局文件res\layout\main.xml,增加一個TextView對象,用來顯示解析后的用戶數(shù)據(jù)<?xmlversion="1.0"encoding="utf-8"?>vLinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent">vTextViewandroid:id="@+id/textView"android:layout_width="fill_parent"android:layout_height="fill_parent"/>v/LinearLayout>OPhoneSDK提供了Apache的HttpClient類處理網(wǎng)絡(luò)訪問,相信很多讀者朋友都在其他項目當中用到過HttpClient。我寫了一個方法,獲取某一網(wǎng)址的網(wǎng)頁內(nèi)容,代碼如下:*獲取網(wǎng)址內(nèi)容*@paramurl*@return*@throwsException*/privateStringgetContent(Stringurl)throwsException{StringBuildersb=newStringBuilder();HttpClientclient=newDefaultHttpClient();HttpParamshttpParams=client.getParams();//設(shè)置網(wǎng)絡(luò)超時參數(shù)HttpConnectionParams.setConnectionTimeout(httpParams,3000);HttpConnectionParams.setSoTimeout(httpParams,5000);HttpResponseresponse=client.execute(newHttpGet(url));HttpEntityentity=response.getEntity();if(entity!=null){BufferedReaderreader=newBufferedReader(newInputStreamReader(entity.getContent(),"UTF-8"),8192);Stringline=null;while((line=reader.readLine())!=null){sb.append(line+"\n");}reader.close();}returnsb.toString();}@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);try{StringBuffersb=newStringBuffer();//在測試過程中,經(jīng)常是用本機做測試服務(wù)器,訪問本機的IP地址要設(shè)置為Stringurl="http:〃:8080/article/JSONDemoServlet";S

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論