標籤:
一:json的簡介
json指的是Javascript對象標記法,是一種輕量級文本資料交換格式,類似於XML,但比XML更小、更快、更易解析
二:Json與XML的比較(copy網上的)
優點:
比xml格式簡單;
json是更好的資料交換格式;xml是更好的文檔交換格式;
json更易於機器閱讀,使用簡單的用戶端庫或者自身支援(javascript);
json可被瀏覽器用戶端支援;
可支援各種通用的資料結構,記錄、列表、樹;
21種語言支援可解析和產生json格式
缺點:
沒有xml中類似CDATA的特性,不適合傳遞聲音和圖片等位元據;
json不具備顯示能力,和xml相比;
json不可擴充,和xml相比。
三:json用於描述資料結構有兩個方式
1,"名稱/值”對的集合,又稱為JSON Object,名與值之前用“:”分隔開來
{name:value}
例如:
{"width":"123","Height":"456"}
2,值的有序列表,又稱為JSON Array
例如:
{"employee":[{"width":"123" , "height":"345"} , {"width":"234" , "height":"455"} , {"width":"566" , "height":"269"}]}
四:json解析資料需要的jar包
五:json資料解析
解析json資料的時候,要分清是解析 JSON Object 還是JSON Array,然後再解析
(1)解析JSON Object之一
例如:解析 {"name" : "value"}
通過JSONObject.getString("name")方法就可以得到JSON對象中String名稱的值
//建立JSONObject,將jsonString字串轉換JSON 對象對應的文本
JSONObject demoJson = new JSONObject(jsonString);
String s = demoJson.getString("name");//就可以得到name對應的值
(2) 解析 JSON Object之二
一個包括兩個“名稱/值”
{“name1” :“android:” ,“name2” : ”java“}
通過JSONObject.getString("name")方法就可以得到JSON對象中String名稱的值
//建立JSONObject,將jsonString字串轉換JSON 對象對應的文本
JSONObject demoJson = new JSONObject(jsonString);
String name1 = demoJson.getString("name1");
String name2 = demoJson.getString("name2");
(3) 解析JSON Array
解析json文本 {”number“ :”1,1,3,5“}
//建立JSONArray,將 jsonString字串轉換JSON 對象對應的文本
JSONObject demoJson = new JSONObject(jsonString);
//擷取number對用的數組
JSONArray list = demoJson.getJSONArray("number");
for(int i = 0,k = list.length(); i < k; i ++)
{
//其他的用getString(i),,,類似
System.out.println(list.getInt(i));
}
(4)解析JSON Oject與JSON Array混合對象
{"books" : [{"zhang" : "value1" , "zhang" : "value2"}]}
JSONObject demoJson = new JSONObject(jsonString);
//首先是要擷取books對應的值
JSONArray list = demoJson.getJSONArray("books");
//然後依次取出list裡面的值
for(int i = 0, k = list.length() ; i < k; i++)
{
//第i個JSONArray中的值為JSON Object “名稱/值”對,然後通過getString("zhang")來擷取值
System.out.println(list.getJSONObject( i ).getString("zhang"));
}
伺服器裡面的資料
package com.test.Demo;import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.List;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;public class JSONDemoServlet extends HttpServlet {private static final long serialVersionUID = -7368225680407826408L; private List<User> list; /** * 處理post方式提交的資料 */@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}/** * 出來get方式提交的資料 */@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubresponse.setContentType("text/plain");response.setCharacterEncoding("UTF-8");PrintWriter out = response.getWriter(); //準備使用者資料 prepareData(); //JSON數組 JSONArray array = new JSONArray(); for(User bean :list){ //單個使用者JSON對象 JSONObject obj = new JSONObject(); try{ obj.put("id", bean.getId()); obj.put("name", bean.getName()); obj.put("email", bean.getEmail()); obj.put("gender", bean.getGender()); }catch (Exception e) {// TODO: handle exception} //array.put(obj); array.add(obj); } //輸出 out.write(array.toString()); out.flush(); out.close(); } private void prepareData() {list = new ArrayList<User>();User bean1 = new User();bean1.setId(1001); bean1.setName("Tony"); bean1.setEmail("[email protected]"); bean1.setGender("male"); list.add(bean1); User bean2 = new User();bean2.setId(1002);bean2.setName("Jack"); bean2.setEmail("[email protected]"); bean2.setGender("male"); list.add(bean2); User bean3 = new User(); bean3.setId(1003); bean3.setName("Marry"); bean3.setEmail("[email protected]"); bean3.setGender("female"); list.add(bean3); User bean4 = new User(); bean4.setId(1004); bean4.setName("Linda"); bean4.setEmail("[email protected]"); bean4.setGender("female"); list.add(bean4); }}
所對應的對象文本為:
package com.test.Demo;public class User {private int id;private String name;private String email;private String gender;public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
在用戶端建立TextView來顯示解析的資料
main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" /></LinearLayout>
主MainActivity
package com.test;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;import org.json.JSONArray;import org.json.JSONObject;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class MainActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);try {StringBuffer sb = new StringBuffer();String url = "http://192.168.1.100:8080/article/JSONDemoServlet";String body = getContent(url);JSONArray array = new JSONArray(body);for (int i = 0; i < array.length(); i++) {JSONObject obj = array.getJSONObject(i);sb.append("id:").append(obj.getInt("id")).append("\t");sb.append("name:").append(obj.getString("name")).append("\r\n");sb.append("gender:").append(obj.getString("gender")).append("\t");sb.append("email:").append(obj.getString("email")).append("\r\n");sb.append("----------------------\r\n");}TextView textView = (TextView) findViewById(R.id.textView);textView.setText(sb.toString());} catch (Exception e) {// TODO: handle exception}}private 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();}}
Android JSON解析資料