JSON與FastJSON詳解
文章目錄
JSON
JSON簡介
JavaScript Object Notation(JavaScript 物件表示法)是目前最常用的執行物件序列化的方式。
雖然 json 最初是為了在 JavaScript 語言中使用的,但實際上 json 本身跟語言沒有任何關係,各種程式語言都可以使用。
JSON基本格式
必須是:物件
{
}
或 陣列
[
]
JSON語法規則
資料用 名稱 : 值 (也叫鍵值對) 表示
名稱(鍵)必須是字串
鍵、值之間用冒號 “:” 分隔。
多條資料之間,用逗號 “,” 分隔
注意符號都是半形,不要因為輸入法的原因輸入全形了
JSON值的型別
- 數字(整數或浮點數)
- 字串(在雙引號中)
- 邏輯值(true 或 false)
- 陣列(在中括號中)
- 物件(在大括號中)
- null
- 值可以是陣列、物件,就意味著資料和物件可以任意巢狀、任意深度。
JSON範例
{ "name": "韋小寶", "age": 26, "height": 182.4, "birthday": "1670-7-28", "isRich": true, "wifes": ["阿珂", "雙兒", "建寧公主", "蘇荃", "沐劍屏", "曾柔", "方怡"], "firstMaster": { "name": "陳近南", "birthday": "1634-12-1" } }
FastJSON
FastJSON簡介
在 Java 程式中如何操作和使用 json 呢?最常見的是使用 FastJSON
astJSON 是一個Java語言編寫的高效能、功能完善、完全支援官方標準的 JSON 庫。
使用 FastJson 來操作 json 以及完成物件序列化、反序列化的操作,會非常方便。
物件序列化
下面我們來看一下使用 FastJSON 進行物件序列化的例子。
如果是本地的 IDE 環境,在編碼之前,需要引入依賴:
<!-- 在下列地址查詢最新的版本:https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
註釋中的URL,可以查詢最新的版本號。一般來說版本號越高,說明越新。但應避免使用帶有 alpha beta 標記的版本,表示測試版可能不穩定。
使用FastJSON序列化物件
首先必須 import
import com.alibaba.fastjson.JSON;
然後就可以實現啦
public static void main(String[] args) {
Building b = new Building();
b.setName("創業大廈");
b.setAddress("天寧蘭陵蘭陵路26號 ");
String content = JSON.toJSONString(b);
System.out.println(content);
}
呼叫 JSON.toJSONString(dog) 方法,把 Building 物件轉換為 JSON 格式的字串返回。
使用FastJSON反序列化物件
所謂序列化,就是將物件轉換為 JSON 格式字串的過程,那麼顧名思義,反序列化就是將 JSON 格式字串還原為物件的過程。
序列化使用的是 fastjson 庫,那麼反序列化同樣也使用 fastjson 庫。
反序列化程式碼:
public static void main(String[] args) {
Building b = new Building();
b.setName("創業大廈");
b.setAddress("天寧蘭陵蘭陵路26號");
String content = JSON.toJSONString(b);
// 轉換為一個具體的物件
Building b2 = JSON.parseObject(content, Building.class);
String name = b2.getName();
System.out.println(name);
// 特殊情況下,java系統裡沒有具體物件的 class ,可以反序列化為 Map
Map bInfo = JSON.parseObject(content, Map.class);
String name2 = (String) bInfo.get("name");
System.out.println(name2);
}
反序列化為具體物件
反序列化時,呼叫 JSON.parseObject(content, Building.class) 把字串轉換為 Java 物件。
第一個引數是字串內容
第二個引數是目標類
轉換為具體的物件後,就可以使用物件的屬性和方法了,例如呼叫 b2.getName(); 取值。
反序列化為Map
少數複雜的場景,程式需要把字串轉換為物件,但是系統中又沒有依賴具體的目標類。這時可以把字串轉換為 Map 物件。
第二個引數改為 Map 作為目標類即可。
大家都知道,Map 是介面,而介面是不能直接例項化的,必須有個類實現接口才能例項化。那麼為什麼這裡可以寫 Map 介面呢,反序列化後的結果到底是什麼呢?
Java 的特點是“面向介面程式設計”,這就意味著不必要關心具體是哪種 Map (HashMap、TreeMap等)。
這麼做的好處是 解耦。
少數複雜場景,轉換為 Map 從而避免依賴具體的類,也是一種 解耦 的表現。讓系統更少的依賴其它系統的程式碼,可以使系統更易於維護。
反序列化為List
當 JSON 格式是 {} 時,表示物件,可以反序列化為具體的物件或者 Map
當 JSON 格式是 [] 表示陣列,Java 中一般不直接使用陣列,而是更方便的 List
List dataList = JSON.parseObject(content, List.class);
那麼,List 集合中,包含的到底是什麼呢?
反序列化的結果,取決於原始字串的格式
- 案例一
["a1","a2","a3"]
表示集合中包含的是字串(字串也是物件)。反序列化的結果是:
List<String> dataList = JSON.parseObject(content, List.class);
- 案例二
[{"a1":"1"},{"a2":"2"}]
表示集合中包含的是物件。反序列化的結果是:
List<Map<String, String>> dataList = JSON.parseObject(content, List.class);
- 案例三
[["a1","a2","a3"]]
表示集合中包含的是子集合。反序列化的結果是:
List<List<String>> dataList = JSON.parseObject(content, List.class);
總之,源資料格式越複雜,反序列化的結果,巢狀就越多也越複雜。在使用過程中一定要注意弄清楚源資料的格式。