1. 程式人生 > 其它 >JSON與FastJSON詳解

JSON與FastJSON詳解

技術標籤:java學習javajson程式語言

文章目錄

JSON

JSON簡介

JavaScript Object Notation(JavaScript 物件表示法)是目前最常用的執行物件序列化的方式。

雖然 json 最初是為了在 JavaScript 語言中使用的,但實際上 json 本身跟語言沒有任何關係,各種程式語言都可以使用。

json官方指定了一套標準,各種語言都支援這一套標準,所以 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);

總之,源資料格式越複雜,反序列化的結果,巢狀就越多也越複雜。在使用過程中一定要注意弄清楚源資料的格式。