1. 程式人生 > 其它 >fastJson的簡單使用

fastJson的簡單使用

Json是一種輕量級的資料交換格式,採用一種“鍵:值”對的文字格式來儲存和表示資料,在系統交換資料過程中常常被使用,是一種理想的資料交換語言。在使用Java做Web開發時,不可避免的會遇到Json的使用。下面我們就簡單講一下Json的使用以及fastjson.jar包的使用。

一:JSON形式與語法

1.1:JSON物件

我們先來看以下資料:

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

第一個資料就是一個Json物件,觀察它的資料形式,可以得出以下語法:

1:資料在花括號中

2:資料以"鍵:值"對的形式出現(其中鍵多以字串形式出現,值可取字串,數值,甚至其他json物件)

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

遵守上面3點,便可以形成一個json物件。

1.2:JSON物件陣列

接下來我們再看第二個資料,觀察它的資料形式,可以得出以下語法:

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

1:資料在方括號中(可理解為陣列)

2:方括號中每個資料以json物件形式出現

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即可下載最新的包

 

2.2:fastjson原始碼分析與使用

在包中,可以發現主要的3個類,JSON,JSONArray,JSONObject

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

 

 

聯絡上面講到的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

 

 

 該方法用的比較少,主要用於將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+"]";
}

}