天天看點

Android中的JSON解析方式:json; Gson ; Fastjson

本文主要介紹Json資料的解析

----a,json資料的介紹

----b,json資料的解析

----c,gson資料的解析,谷歌公司的一種格式

----d,fastjson資料的解析,阿裡巴巴的一種格式

通過本文的學習能掌握json資料格式的解析,為以後json格式資料的解析做到熟練于心。

Json的全稱:JavaScript Object Notation

JSON的定義:

       一種輕量級的資料交換格式,具有良好的可讀和便于快速編寫的特性。業内主流技術為其提供了完整的解決方案(有點類似于正規表達式 ,獲得了當今大部分語言的支援),進而可以在不同平台間進行資料交換。JSON采用相容性很高的文本格式,同時也具備類似于C語言體系的行為。 – Json.org

Json建構于兩種結構:

“名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被了解為對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵清單(keyed list),或者關聯數組 (associative array)。 

值的有序清單(An ordered list of values)。在大部分語言中,它被了解為數組(array)

JSON對象是一個無序的“‘名稱/值’對”集合。

一個對象以“{”(左括号)開始,“}”(右括号)結束。

每個“名稱”後跟一個“:”(冒号);“‘名稱/值’ 對”之間使用“,”(逗号)分隔。

如:      {

“name”:”jackson”,

    “age”:100

    }

數組是值(value)的有序集合。一個數組以“[”(左中括号)開始,“]”(右中括号)結束。值之間使用“,”(逗号)分隔

如:{

“students”:

[

{“name”:”jackson”,“age”:100},

{“name”:”michael”,”age”:51}

]

    }

一。谷歌GSON技術的介紹

Gson這個Java類庫可以把Java對象轉換成JSON,也可以把JSON字元串轉換成一個相等的Java對象。

Gson支援任意複雜Java對象包括沒有源代碼的對象。

二。阿裡巴巴FastJson技術的介紹

FastJson是一個Json處理工具包,包括“序列化”和“反序列化”兩部分,它具備如下特征:

速度最快,測試表明,fastjson具有極快的性能,超越任其他的Java Json parser。包括自稱最快的JackJson。

功能強大,完全支援Java Bean、集合、Map、日期、Enum,支援範型,支援自省。

無依賴,能夠直接運作在Java SE 5.0以上版本

支援Android。

開源 (Apache 2.0)

三。JSON Vs XML

1.JSON和XML的資料可讀性基本相同

2.JSON和XML同樣擁有豐富的解析手段

3.JSON相對于XML來講,資料的體積小

4.JSON與JavaScript的互動更加友善

5.JSON對資料的描述性比XML較差

6.JSON的速度要遠遠快于XML 

四。android2.3提供的json解析類 

android的json解析部分都在包org.json下,主要有以下幾個類: 

JSONObject:可以看作是一個json對象,這是系統中有關JSON定義的基本單元,其包含一對兒(Key/Value)數值。它對外部(External:   應用toString()方法輸出的數值)調用的響應展現為一個标準的字元串(例如:{"JSON": "Hello, World"},最外被大括号包裹,其中的Key和Value被冒号":"分隔)。其對于内部(Internal)行為的操作格式略微,例如:初始化一個JSONObject執行個體,引用内部的put()方法添加數值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之間是以逗号","分隔。Value的類型包括:Boolean、JSONArray、JSONObject、Number、String或者預設值JSONObject.NULL object 。
JSONStringer:json文本建構類 ,根據官方的解釋,這個類可以幫助快速和便捷的建立JSON text。其最大的優點在于可以減少由于 格式的錯誤導緻程式異常,引用這個類可以自動嚴格按照JSON文法規則(syntax rules)建立JSON text。每個JSONStringer實體隻能對應建立一個JSON text。。其最大的優點在于可以減少由于格式的錯誤導緻程式異常,引用這個類可以自動嚴格按照JSON文法規則(syntax rules)建立JSON text。每個JSONStringer實體隻能對應建立一個JSON text。
JSONArray:它代表一組有序的數值。将其轉換為String輸出(toString)所表現的形式是用方括号包裹,數值以逗号”,”分隔(例如:     [value1,value2,value3],大家可以親自利用簡短的代碼更加直覺的了解其格式)。這個類的内部同樣具有查詢行為,     get()和opt()兩種方法都可以通過index索引傳回指定的數值,put()方法用來添加或者替換數值。同樣這個類的value類型可以包括:Boolean、JSONArray、JSONObject、Number、String或者預設值JSONObject.NULL object。

JSONTokener:json解析類 

JSONException:json中用到的異常 

首先建立一個公共的Bean

package com.qianfeng.domain;

public class Person {

	private int age;
	private String name;

	public Person(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}
	@Override
	public String toString() {
		return "Person [age=" + age + ", name=" + name + "]";
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Person() {
		// TODO Auto-generated constructor stub
	}

}
           

第一種方式:

Json方式:

public class JsonList {

	public JsonList() {
		// TODO Auto-generated constructor stub
	}

	public static List<Person> getList() {
		List<Person> list = new ArrayList<Person>();
		list.add(new Person(1002,"李四2"));
		list.add(new Person(1003,"李四3"));
		list.add(new Person(1001,"李四1"));
		return list;
	}
	public static Person getPerson(){
		return new Person(1002,"李四2"); 
	}
}
           
import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;

public class JsonTools {

	public JsonTools() {
		// TODO Auto-generated constructor stub
	}

	public static String getString(Person person) {
		JSON json = JSONSerializer.toJSON(JsonList.getPerson());
		return json.toString();
	}

	/**
	 * 
	 * @param msgString
	 * @return
	 */
	public static Person getPerson(String msgString) {
		Person person = new Person();
		JSONArray array = new JSONArray();
		array.add(msgString);
		JSONObject obj = array.getJSONObject(0);
		// System.out.println(obj.get("age"));
		// System.out.println(obj.get("name"));
		person.setAge(obj.getInt("age"));
		person.setName(obj.getString("name"));
		return person;
	}

	public static String getListString(List<Person> listPersons) {
		JSON json = JSONSerializer.toJSON(listPersons);
		return json.toString();
	}

	
	/**
	 * 将一個json格式的字元串轉換成行對應的對象
	 * @param str
	 * @return
	 */
	public static List<Person> getPersons(String str) {
		List<Person> list = new ArrayList<Person>();
		JSONArray array = new JSONArray();
		array.add(str);
		JSONArray array2 = array.getJSONArray(0);
		for (int i = 0; i <array2.size(); i++) {
			JSONObject jsonObject =  array2.getJSONObject(i);
			Person person = new Person();
			person.setAge(jsonObject.getInt("age"));
			person.setName(jsonObject.getString("name"));
			list.add(person);
		}
		return list;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// JSON json = JSONSerializer.toJSON(JsonList.getList());
		// System.out.println(getString(new Person(23,"jack")));
		// System.out.println(getPerson("{'age':1002,'name':'李四2'}").toString());
		// System.out.println(getListString(JsonList.getList()));
		String msgString = "[{'age':1002,'name':'李四2'},{'age':1003,'name':'李四3'},{'age':1001,'name':'李四1'}]";
		List<Person> lPersons = getPersons(msgString);
		for(Person p:lPersons){
			System.out.println(p.toString());
		}
	}
}
           

第二種方式:

Gson方式

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.android.domain.Person;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class GsonTools {

	public GsonTools() {
		// TODO Auto-generated constructor stub
	}

	public static String createGsonString(Object object) {
		Gson gson = new Gson();
		String gsonString = gson.toJson(object);
		return gsonString;
	}

	public static <T> T changeGsonToBean(String gsonString, Class<T> cls) {
		Gson gson = new Gson();
		T t = gson.fromJson(gsonString, cls);
		return t;
	}

	public static <T> List<T> changeGsonToList(String gsonString, Class<T> cls) {
		Gson gson = new Gson();
		List<T> list_person = gson.fromJson(gsonString,
				new TypeToken<List<T>>() {
				}.getType());
		return list_person;
	}

	public static List<Map<String, Object>> changeGsonToListMaps(String gsonString) {
		List<Map<String, Object>> list = null;
		Gson gson = new Gson();
		list = gson.fromJson(gsonString,
				new TypeToken<List<Map<String, Object>>>() {
				}.getType());
		return list;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// Person person1 = new Person("張三1", 24, "北京1");
		// Person person2 = new Person("張三2", 23, "北京2");
		// List<Person> list = new ArrayList<Person>();
		// list.add(person1);
		// list.add(person2);
		//
		// String gsonString = createGsonString(list);
		// System.out.println(gsonString);
		// Gson gson = new Gson();
		// List<Person> list_person = changeGsonToList(gsonString,Person.class);
		// System.out.println(list_person.toString());
		// Person pp = changeGsonToBean(gsonString,Person.class);
		// System.out.println(pp);
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("name", "jack");
		map.put("age", 23);
		Map<String, Object> map2 = new HashMap<String, Object>();
		map2.put("name", "rose");
		map2.put("age", 24);
		list.add(map);
		list.add(map2);
		String gsonString = createGsonString(list);
		System.out.println(gsonString);
		List<Map<String, Object>> list2 = changeGsonToListMaps(gsonString);
		System.out.println(list2.toString());
	}

}
           

第三種方式:

fastJosn方式

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.asm.Type;
import com.alibaba.fastjson.util.TypeUtils;

public class FastJsonTools {

	public FastJsonTools() {
		// TODO Auto-generated constructor stub
	}

	public static String createJsonString(Object object) {
		String jsonString = JSON.toJSONString(object);
		return jsonString;
	}

	public static <T> T createJsonBean(String jsonString, Class<T> cls) {
		T t = JSON.parseObject(jsonString, cls);
		return t;
	}

	public static <T> List<T> createJsonToListBean(String jsonString,
			Class<T> cls) {
		List<T> list = null;
		list = JSON.parseArray(jsonString, cls);
		return list;
	}

	/**
	 * @param jsonString
	 * @return
	 */
	public static List<Map<String, Object>> createJsonToListMap(
			String jsonString) {
		List<Map<String, Object>> list2 = JSON.parseObject(jsonString,
				new TypeReference<List<Map<String, Object>>>() {
				});
		return list2;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// Person person1 = new Person("張三1", 24, "北京1");
		// Person person2 = new Person("張三2", 23, "北京2");
		// List<Person> list = new ArrayList<Person>();
		// list.add(person1);
		// list.add(person2);
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("name", "jack");
		map.put("age", 23);
		Map<String, Object> map2 = new HashMap<String, Object>();
		map2.put("name", "rose");
		map2.put("age", 24);
		list.add(map);
		list.add(map2);

		String jsonString = JSON.toJSONString(list);
		System.out.println(jsonString);
		// JSON.parseArray(arg0, arg1)
		List<Map<String, Object>> list2 = JSON.parseObject(jsonString,
				new TypeReference<List<Map<String, Object>>>() {
				});
		// List<Person> lists = JSON.parseArray(arg0, arg1);
		System.out.println(list2.toString());

	}

}
           

示例下載下傳

示例下載下傳

參考網址

json官網

google-gson

部落格一

=======================================================================================================================

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

/**  
         * 擷取"數組形式"的JSON資料,  
         * @param path  網頁路徑  
         * @return  傳回JSONArray  
         * @throws Exception  
          */  
        public static String getJSONArray(String path) throws Exception {
                String json = null;
                URL url = new URL(path);
                // 利用HttpURLConnection對象,我們可以從網絡中擷取網頁資料.
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                // 機關是毫秒,設定逾時時間為5秒
                conn.setConnectTimeout(5 * 1000); 
                // HttpURLConnection是通過HTTP協定請求path路徑的,是以需要設定請求方式,可以不設定,因為預設為GET
                conn.setRequestMethod("GET"); 
                if (conn.getResponseCode() == 200) {// 判斷請求碼是否是200碼,否則失敗
                        
                        InputStream is = conn.getInputStream(); // 擷取輸入流
                        byte[] data = readStream(is); // 把輸入流轉換成字元數組
                        json = new String(data); // 把字元數組轉換成字元串
//                        JSONArray jsonArray = new JSONArray(json);// 用android提供的架構JSONArray讀取JSON資料,轉換成Array
                }
                return json;
        }
           

該方法傳回解析到的json資料(例:[{"ID":11,"uid":67,"carNo":"豫A000V1"},{"ID":12,"uid":67,"carNo":"豫A9E592"},{"ID":16,"uid":67,"carNo":"豫A1E238"}])

然後就可以解析你想要的字段了

JSONArray jsonArray = new JSONArray(carIdJSON);
                                        for (int i = 0; i < jsonArray.length(); i++) {
                                                JSONObject jsonObject = jsonArray.getJSONObject(i);
    jsonObject.getString("carNo");
    jsonObject.getString("ID");

                                        }
           

有解析就有上傳了(POST上傳),json的上傳要用NameValuePairs,大家可以檢視jdk關于NameValuePairs的解釋

NameValuePairs隻能傳String類型的值

  1. nameValuePairs.add(new BasicNameValuePair("xxx", xxx));

複制代碼 可以上傳很多字段(按需求上傳就行了)

下面就是上傳的方法

  1. //        1. 使用POST方式時,傳遞參數必須使用NameValuePair數組
  2. //        2. 使用GET方式時,通過URL傳遞參數,注意寫法
  3. //        3. 通過setEntity方法來發送HTTP請求
  4. //        4. 通過DefaultHttpClient 的 execute方法來擷取HttpResponse
  5. //        5. 通過getEntity()從Response中擷取内容
  6.         public static int httpPostData(String urlString,List<NameValuePair> nameValuePairs){
  7.                 HttpClient httpclient = new DefaultHttpClient();
  8.                 HttpPost httppost = new HttpPost(urlString);
  9.                 try{
  10.                         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
  11.                         HttpResponse response = httpclient.execute(httppost);
  12.                         int statusCode = response.getStatusLine().getStatusCode();
  13.                         return statusCode;
  14.                 }catch(Exception e){
  15.                         e.printStackTrace();
  16.                 }
  17.                 return 0;
  18.         }

複制代碼 方法傳回請求伺服器,傳回的響應參數

200成功

200伺服器出錯

404伺服器沒響應(伺服器有問題)

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=165428&reltid=227908&pre_thread_id=0&pre_pos=2&ext=CB

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=276713