Json詳解以及fastjson使用教程

Json是一種輕量級的數據交換格式,採用一種「鍵:值」對的文本格式來存儲和表示數據,在系統交換數據過程當中經常被使用,是一種理想的數據交換語言。在使用Java作Web開發時,不可避免的會遇到Json的使用。下面咱們就簡單講一下Json的使用以及fastjson.jar包的使用。java

一:JSON形式與語法

1.1:JSON對象

咱們先來看如下數據:git

{
	"ID": 1001,
	"name": "張三",
	"age": 24
}

第一個數據就是一個Json對象,觀察它的數據形式,能夠得出如下語法:github

1:數據在花括號中json

2:數據以"鍵:值"對的形式出現(其中鍵多以字符串形式出現,值可取字符串,數值,甚至其餘json對象)數組

3:每兩個"鍵:值"對以逗號分隔(最後一個"鍵:值"對省略逗號)ide

遵照上面3點,即可以造成一個json對象。工具

1.2:JSON對象數組

接下來咱們再看第二個數據,觀察它的數據形式,能夠得出如下語法:源碼分析

[
	{"ID": 1001, "name": "張三", "age": 24},
	{"ID": 1002, "name": "李四", "age": 25},
	{"ID": 1003, "name": "王五", "age": 22}

]

1:數據在方括號中(可理解爲數組)測試

2:方括號中每一個數據以json對象形式出現this

3:每兩個數據以逗號分隔(最後一個無需逗號)

遵照上面3點,即可造成一個json對象數組(及一個數組中,存儲了多個json對象)

理解了上面兩種基本的形式,咱們就能夠得出其餘的數據形式,例以下面這個:

{
	"部門名稱":"研發部",
	"部門成員":[
	{"ID": 1001, "name": "張三", "age": 24},
	{"ID": 1002, "name": "李四", "age": 25},
	{"ID": 1003, "name": "王五", "age": 22}],
	"部門位置":"xx樓21號"
}

這是上面兩個基本形式結合出來的一種變形,經過這種變形,使得數據的封裝具備很大的靈活性,能讓開發者自由的發揮想象力。

1.3:JSON字符串

JSON字符串也是在平時開發中使用較多的,json字符串應知足如下條件:

1:它必須是一個字符串,由" "或者' '包裹數據,支持字符串的各類操做

2:裏面的數據格式應該要知足其中一個格式,能夠是json對象,也能夠是json對象數組或者是兩種基本形式的組合變形。

總結:json能夠簡單的分爲基本形式:json對象,json對象數組。兩種基本格式組合變形出其餘的形式,但其本質仍是json對象或者json對象數組中的一種。json對象或對象數組能夠轉化爲json字符串,使用於不一樣的場合。

注意點:在封裝json數據的時候,很容易出現錯誤,好比粗心的在最後一條數據的末尾加上了逗號等等,這裏我提供一個在線驗證工具,方便你們驗證json數據格式的正確性

http://www.bejson.com/

二:fastjson介紹與使用

2.1:fastjson簡介與jar下載

fastjson.jar是阿里爸爸開發的一款專門用於Java開發的包,能夠方便的實現json對象與JavaBean對象的轉換,實現JavaBean對象與json字符串的轉換,實現json對象與json字符串的轉換。除了這個fastjson之外,還有Google開發的Gson包,其餘形式的如net.sf.json包,均可以實現json的轉換。方法名稱不一樣而已,最後的實現結果都是同樣的。

將json字符串轉化爲json對象
在net.sf.json中是這麼作的
JSONObject obj = new JSONObject().fromObject(jsonStr);//將json字符串轉換爲json對象

在fastjson中是這麼作的
JSONObject obj=JSON.parseObject(jsonStr);//將json字符串轉換爲json對象

今天咱們主要講fastjson的使用,首先應該在Java工程中導入對應的fastjson.jar包,

fastjson.jar包原始下載地址:https://github.com/alibaba/fastjson

點擊頁面中的download便可下載最新的包

fastjson.jar包百度雲盤下載地址:https://pan.baidu.com/s/1CCGoRCdSjNUDB736cRCDBw

2.2:fastjson源碼分析與使用

在包中,能夠發現主要的3個類,JSON,JSONArray,JSONObject

三者之間的關係以下,JSONObject和JSONArray繼承JSON

若是大家看不到源代碼,請參考另外一篇博客,先安裝Java反編譯工具:

https://blog.csdn.net/srj1095530512/article/details/81587601

聯繫上面講到的json基礎知識並對應這三個類,能夠發現,JSONObject表明json對象,JSONArray表明json對象數組,

JSON表明JSONObject和JSONArray的轉化。

JSONObject類源碼分析與使用

觀察該類的繼承與實現關係,不難發現,JSONObject實現了Map接口,而json對象中的數據都是以"鍵:值"對形式出現,能夠猜測,      JSONObject底層操做是由Map實現的。

再來看類中的主要方法:

類中主要是get()方法。由於JSONObject至關於json對象,因此該類中主要封裝了各類get方法,經過"鍵:值"對中的鍵來獲取其對應的值。且方法的輸入參數幾乎皆爲String類型,這是由於json對象中,"鍵:值"對的鍵都是String類型的。來看一下平時用到較多的               getString(String key)方法,該方法輸入參數爲String key(鍵),輸出爲String ,用於獲取json對象中的字符串型數據。例如經過該方法獲取  "name":"bob"鍵值對中name這個鍵所對應的值bob。

看其源碼,能夠發現,內部主要是由get(key)方法實現,找到這個方法以下:

發現內部主要由Map接口中的get()方法實現。

再去看JSONObject中另外一個經常使用的方法getInteger(String key),該方法獲取json對象中的整型數據,例如獲取"age:20"鍵值對中age對應的整型數值20.

對比getString(String key)方法,二者極爲類似,都是經過Map接口的get()方法實現。

再看幾個其餘的方法,也是由Map接口中的相應方法實現的,這裏再也不贅述。

總結:JSONObject對應json對象,經過各類形式的get()方法能夠獲取json對象中的數據,也可利用諸如size(),isEmpty()等方法獲取"鍵:值"對的個數和判斷是否爲空。其本質是經過實現Map接口並調用接口中的方法完成的。

JSONArray類源碼分析與使用

觀察JSONArray的繼承與實現,並結合上面對JSONObject的分析,不難發現,其內部是有List接口中的方法來完成操做的。

一樣觀察JSONArray類中的方法,因爲方法較多,下面分爲兩部分

首先來明確一點,由於JSONArray表明json對象數組,json數組對象中存儲的是一個個json對象,因此類中的方法主要用於直接操做json對象。好比這其中的add(),remove(),containsAll()方法,對應於json對象的添加,刪除與判斷。

其內部主要有List接口中的對應方法來實現。

跟JSONObject同樣,JSONArray裏面也有一些get()方法,不過都不經常使用,最有用的應該是getJSONObject(int index)方法,該方法用於獲取json對象數組中指定位置的JSONObject對象,配合size()方法,可用於遍歷json對象數組中的各個對象。

經過以上兩個方法,在配合for循環,便可實現json對象數組的遍歷,固然JSONArray中也實現了迭代器方法來遍歷,這和List的遍歷極爲類似。

經過遍歷獲得JSONObject對象,而後再利用JSONObject類中的get()方法,便可實現最終json數據的獲取!!!

好了,接下來咱們看最後一個,也是最重要的一個類JSON類。之因此把這個放在最後,是由於這個類主要是實現轉化用的,最後的數據獲取,仍是要經過上面的JSONObject和JSONArray來實現。

JSON類源碼分析與使用

先來看一下這個類中的主要方法,方法比較多,也分爲兩部分:

仔細觀察這些方法,主要是實現json對象,json對象數組,javabean對象,json字符串之間的相互轉化。

JSON類之toJSONString()方法,實現json對象轉化爲json字符串和javabean對象轉化爲json 字符串

該方法通過屢次重載,但最終都是實現json對象轉化爲json字符串和javabean對象轉化爲json 字符串。其中,有關鍵字transient修飾的toJSONString()用於json對象序列化過程當中,但願某個"鍵:值"對數據不變的應用中。

JSON類之parseObject()方法,實現json字符串轉換爲json對象或javabean對象

該方法返回JSONObject對象,用於實現json字符串向json對象的轉化,其內部調用了parse()方法,調用底層的DefaultJSONParser解析類進行轉化,在轉化失敗時,拋出can not cast to JSONObject異常。

該方法不只能實現json字符串向json對象的轉化,通過重載以後,還能實現json字符串向javabean對象的轉化

json字符串與javaBean之間的轉換可使用 TypeReference<T> 這個類,也可使用Class這個類。

Student stu1=JSON.parseObject(jsonstr,new TypeReference<Student>(){});
Student stu1=JSON.parseObject(jsonstr,Student.class);

我推薦使用第二種Class類反射來實現,比較簡單。

JSON類之JSONArray()方法,實現json字符串轉化爲json對象數組或List<T>

與parseObject()方法相似,parseArray()將json字符串轉化爲json對象數組或轉化成包含泛型的List

JSON類之toJSON()方法,實現javabean對象轉化爲json對象

該方法用的比較少,主要用於將javabean對象轉化爲json對象,內部經過Map,LinkedHashMap,HashMap等集合接口實現。

JSON類之toJavaObject()方法,實現json對象轉化爲javabean對象

該方法也通過重載,經過TypeReference類和Class類反射來實現,主要講json對象轉化爲javabean對象,用的也比較少。

至此,JSON類中的方法也講解的差很少了,下面給出Java實例來實現以上的各類轉換。

測試類:

package jsonTest;

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.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;


public class MyJson {
	
	public static void main(String[] args) {
		
		List<Student> list=new ArrayList<>();
		Student student=new Student("bob",24);
		Student student12=new Student("lily", 23);
		list.add(student);
		list.add(student12);
		System.out.println("*******javaBean  to jsonString*******");
		String str1=JSON.toJSONString(student);
		System.out.println(str1);
		System.out.println(JSON.toJSONString(list));
		System.out.println();
		
		System.out.println("******jsonString to javaBean*******");
		//Student stu1=JSON.parseObject(str1,new TypeReference<Student>(){});
		Student stu1=JSON.parseObject(str1,Student.class);
		System.out.println(stu1);
		System.out.println();
		
		System.out.println("******javaBean to jsonObject******");
		JSONObject jsonObject1=(JSONObject)JSON.toJSON(student);
		System.out.println(jsonObject1.getString("name"));
		System.out.println();
		
		System.out.println("******jsonObject to javaBean******");
		Student student2=JSON.toJavaObject(jsonObject1, Student.class);
		System.out.println(student2);
		System.out.println();
		
		System.out.println("*******javaBean to jsonArray******");
		List<Student> stulist=new ArrayList<>();
		for(int i=0;i<5;i++){
			stulist.add(new Student("student"+i, i));
			
		}
		JSONArray jsonArrays=(JSONArray)JSON.toJSON(stulist);
		for(int i=0;i<jsonArrays.size();i++){
		System.out.println(jsonArrays.getJSONObject(i));
		}
		System.out.println();
		
		System.out.println("*****jsonArry to javalist******");
		List<Student> myList=new ArrayList<>();
		for(int i=0;i<jsonArrays.size();i++){
			
		Student student3=JSON.toJavaObject(jsonArrays.getJSONObject(i), Student.class);
			myList.add(student3);
		}
		for(Student stu:myList){
			System.out.println(stu);
		}
		
	        System.out.println();
		
		System.out.println("*****jsonObject to jsonString*****");
		String str4=JSON.toJSONString(jsonObject1);
		System.out.println(str4);
		System.out.println();
		
		System.out.println("*******jsonString to jsonObject*****");
		JSONObject jso1=JSON.parseObject(str1);
		System.out.println(jso1.getString("name"));
		System.out.println();
		
		System.out.println("*****jsonString to jsonArray*****");
		JSONArray jArray=JSON.parseArray(JSON.toJSONString(stulist));
		for(int i=0;i<jArray.size();i++){
		System.out.println(jArray.getJSONObject(i));
		}
		System.out.println();
	}

}

測試類對應的javabean類:

package jsonTest;

public class Student {
	
	private String name;
	private int age;
	
	public Student() {
		// TODO Auto-generated constructor stub
	}
	
	public Student(String name,int age){
		this.name=name;
		this.age=age;
	}
	
	public void setName(String name){
		this.name=name;
		
	}
	
	public String getName(){
		return name;
	}
	
	public void setAge(int age){
		this.age=age;
	}
	
	public int getAge(){
		return age;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "student [name="+name+" , "+"age="+age+"]";
	}
	
}

今天就講到這吧,若是上面有什麼地方錯誤了,請及時指出,避免更多人誤解。若是有什麼不懂的,歡迎交流!

相關文章
相關標籤/搜索