android之JSON 進行網路資料交換
什麼是JSON JSON(JavaScript Object Notation)是一種輕量級的資料交換格式,易於閱讀和編寫,同時也易於機器解析和產生,非常適合於伺服器與用戶端的互動。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 字元可以直接輸出。
Boolean 類型表示為 true 或 false 。此外,JavaScript 中的 null 被表示為 null,注意,true、false和 null 都沒有雙引號,否則將被視為一個 String 。
JSON 還可以表示一個數組對象,使用 [] 包含所有元素,每個元素用逗號分隔,元素可以是任意的
Value,例如,以下數組包含了一個 String,Number,Boolean 和一個 null:
["abc",12345,false,null]
Object 對象在 JSON 中是用 {} 包含一系列無序的 Key-Value 鍵值對錶示的,實際上此處的
Object 相當於 Java 中的 Map,而不是 Java 的 Class 。注意 Key 只能用 String 表
示。例如,一個 Address 對象包含如下 Key-Value:
city:Beijing
street:Chaoyang Road
postcode:100025(整數)
用JSON 表示如下:
{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}其中 Value 也可以是另一個 Object 或者數組,因此,複雜的 Object 可以巢狀表格示,例如,一個
Person 對象包含 name 和 address 對象,可以表示如下:
{"name":"Michael","address": {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
}
下面寫一個執行個體:(記得伺服器端要先導包)
這是在我曾經寫好的代碼上寫的,我現在把主要代碼寫下。
建立一個servlet:
package cn.four.json;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import javax.print.event.PrintServiceAttributeEvent;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONArray;import net.sf.json.JSONObject;import cn.four.service.Foundservice;import cn.four.service.FoundserviceImp;import cn.four.user.Found;public class JSONDemoServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Foundservice fd=new FoundserviceImp(); //我這是以前寫過的,繼承介面List list=fd.getfound(); //new 一個listJSONObject jsb=new JSONObject(); //new 一個JSONObject對象jsb.put("foundlist",list); //得到轉成後的資料JSONArray fdarray=jsb.getJSONArray("foundlist"); //存到數組response.setContentType("text/plain");//解決亂碼response.setCharacterEncoding("UTF-8");PrintWriter out=response.getWriter(); out.write(fdarray.toString()); //關閉 out.flush(); out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}}伺服器端就這樣結束了。
下面是android的介紹
Android SDK 提供了Apache 的HttpClient 類處理網路訪問,相信很多讀者朋友都在其他項目當中用
到過HttpClient。我寫了一個方法類,擷取某一網址的網頁內容,代碼如下:
package com.four.http;import java.io.BufferedReader;import java.io.InputStreamReader;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.params.HttpConnectionParams;import org.apache.http.params.HttpParams;public class httpcontent {public String getContent(String url) throws Exception {StringBuilder sb = new StringBuilder();HttpClient client = new DefaultHttpClient();HttpParams httpParams = client.getParams();// 設定網路逾時參數HttpConnectionParams.setConnectionTimeout(httpParams, 3000);HttpConnectionParams.setSoTimeout(httpParams, 5000);HttpResponse response = client.execute(new HttpGet(url));HttpEntity entity = response.getEntity();if (entity != null) {BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"), 8192);String line = null;while ((line = reader.readLine()) != null) {sb.append(line + "\n");}reader.close();}return sb.toString();}}
我感覺這就是一個固定的類,只要用到JSON,就可以拿去用,暫時沒試,不知道對不對啊。
package com.example.mychat;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.json.JSONArray;import org.json.JSONObject;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ListView;import android.widget.SimpleAdapter;import com.four.http.httpcontent;public class User_tips extends Activity {httpcontent content = new httpcontent();private Button btnshua;private ListView xianshi;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_user_tips);btnshua = (Button) findViewById(R.id.btnshua);xianshi = (ListView) findViewById(R.id.listView1);btnshua.setOnClickListener(new shualistener());}class shualistener implements OnClickListener {@Overridepublic void onClick(View v) {// TODO Auto-generated method stublistxianshi();}}private List> getmessg(String url) {List> list = new ArrayList>();String body;try {body = content.getContent(url);JSONArray array = new JSONArray(body);for (int i = 0; i < array.length(); i++) {JSONObject obj = array.getJSONObject(i);Map map = new HashMap();map.put("foundname", obj.getString("foundname"));map.put("foundplace", obj.getString("foundplace"));list.add(map);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return list;}private void listxianshi(){try {String url = "http://10.20.180.34:8080/lostfound/JSONDemoServlet";SimpleAdapter adapter = new SimpleAdapter(this,getmessg(url), R.layout.list_item, new String[] {"foundname", "username" }, new int[] {R.id.foundname, R.id.username });xianshi.setAdapter(adapter);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
: