Json是一種輕量級的數據交換格式,採用一種「鍵:值」對的文本格式來存儲和表示數據,在系統交換數據過程當中經常被使用,是一種理想的數據交換語言。在使用Java作Web開發時,不可避免的會遇到Json的使用。下面咱們就簡單講一下Json的使用以及fastjson.jar包的使用。java
咱們先來看如下數據:git
{ "ID": 1001, "name": "張三", "age": 24 }
第一個數據就是一個Json對象,觀察它的數據形式,能夠得出如下語法:github
1:數據在花括號中json
2:數據以"鍵:值"對的形式出現(其中鍵多以字符串形式出現,值可取字符串,數值,甚至其餘json對象)數組
3:每兩個"鍵:值"對以逗號分隔(最後一個"鍵:值"對省略逗號)ide
遵照上面3點,即可以造成一個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號" }
這是上面兩個基本形式結合出來的一種變形,經過這種變形,使得數據的封裝具備很大的靈活性,能讓開發者自由的發揮想象力。
JSON字符串也是在平時開發中使用較多的,json字符串應知足如下條件:
1:它必須是一個字符串,由" "或者' '包裹數據,支持字符串的各類操做
2:裏面的數據格式應該要知足其中一個格式,能夠是json對象,也能夠是json對象數組或者是兩種基本形式的組合變形。
總結:json能夠簡單的分爲基本形式:json對象,json對象數組。兩種基本格式組合變形出其餘的形式,但其本質仍是json對象或者json對象數組中的一種。json對象或對象數組能夠轉化爲json字符串,使用於不一樣的場合。
注意點:在封裝json數據的時候,很容易出現錯誤,好比粗心的在最後一條數據的末尾加上了逗號等等,這裏我提供一個在線驗證工具,方便你們驗證json數據格式的正確性
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
在包中,能夠發現主要的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+"]"; } }
今天就講到這吧,若是上面有什麼地方錯誤了,請及時指出,避免更多人誤解。若是有什麼不懂的,歡迎交流!