JSON(JavaScript Object Notation)為一種數據交換結構,相比XML,JSON的語法顯得更為輕巧,大大地減少數據交換時所要傳遞的資料量。在Java語言裡,有許多根據JSON數據交換標準實作出來的Library,json.org和Gson就是其中的兩種。



json.org

Gson

json.org和Gson的差異

json.org和Gson雖都能夠完整處理JSON資料,但在實際撰寫程式的時候,兩者的用法卻不太相同。舉例來說:若要撈出JSON物件(JSONObject)內所有的Key,json.org的函式庫可以直接使用keySet()方法得到key的set(方法類似Java Collections的HashMap),然後再使用for-each或是iterator去走訪set裡所有的key。但是在Gson中,需要使用entrySet()取得所有entry的set,再用for-each或是iterator去走訪set裡所有的entry,然後用entry的getKey()方法來取得entry的key。筆者比較喜歡json.org的作法,因為少了一層entry,做起來稍微容易。若要key值所對應的value,可以用JSON物件的get方法。Gson取出的entry雖可以直接取得JsonElement,若要使用還要先去轉換型態,個人覺得沒有比較好用,所以通常還是會拿key透過get方法取出值。

Gson提供了一個方便的功能,它能夠將Java物件轉換成JSON字串或是JSON的物件或陣列,也可以將JSON字串或是JSON的物件或陣列轉回Java物件。若有個class結構如下:

class A {

    int a = 1;
    String s = "123";
    int[] arr = {2,4,6};
}

透過Gson可以將這個A類別產生出的物件實體轉換成JSON字串如下:

{"a":1,"s":"123","arr":[2,4,6]}

若使用json.org的函式庫,則沒有提供類似的功能,只能夠用put的方法慢慢將key和value插入進JSON物件內。

MagicLen JSON(Mson)

由於筆者習慣使用json.org的函式庫,又想要擁有Gson的功能,因此決定將json.org和Gson結合,創造出Mson。使用Mson可以將Java物件轉換成json.org的JSON物件或陣列,也可以將json.org的JSON物件或陣列轉回Java物件。而且比起Gson所提供的轉換功能,Mson更為簡易,而且層數更少。同時,Mson還支援一次將多種Java不同的物件轉成JSON陣列,當然也能將此包含不同Java物件的JSON陣列,轉回Java物件的陣列(Object[])。Gson採用固定型態的轉換,而Mson則採用優先型態的轉換,使用者可以自訂要嘗試轉換成的物件類別,故使用起來Mson會比Gson更為自由、簡單。

除此之外,Mson還可以使用toString(json, true)方法來產生出整齊的JSON結構字串,結果如下:

{
    "a" : [
        {
	        "b" : "Hello, welcome to MagicLen!"
        },
        {
	        "c" : "My name is Magic Len."
        },
        "Thanks",
        88
    ]
}

也可以使用toXML或是fromXML方法將JSON轉成XML,或是將XML轉成JSON哦!

<a><b>Hello, welcome to MagicLen!</b></a><a><c>My name is Magic Len.</c></a><a>Thanks</a><a>88</a>

MagicLenJSON的原始碼、函式庫和文件可以在Github上取得,網址如下: