天天看點

從零開始學習JSON

作者:金聞希

0 前言

很多年前就接觸過JSON,那是一份接口協定文檔,兩個子產品程式之間用JSON通信。

但是,直到最近,才學習JSON,學會用手搓、用aardio程式設計處理JSON資料等。究其原因如下:

  1. 拖延症已病入膏肓。
  2. 現有JSON學習資料,幾乎總與JavaScript、或者其他什麼語言攪和在一起,讓人望而生畏。

學會之後回頭再看,JSON,其實隻需要一篇小文章就能講清楚。

1 JSON協定

JSON本身是一種協定,與TCP/IP、UDP等網絡協定沒有本質上的不同,與JavaScript等語言也沒有必然聯系。

協定是用來規範通信資料格式的,以便協定雙方能夠順利交換資料(資訊),實作通信。

從零開始學習JSON

2 JSON值

JSON定義了七種資料,稱作JSON值:

1、數字(number)

數字隻能是整數(如:0、2、5)或浮點數(如:7.99)。

2、字元串(string)

字元串以英文雙引号“"”開始與結束(如:"json")。

3、數組(array)

數組以左中括号“[”開始,以右中括号“]”結束(如:[0, 2, 5, 7])。

4、對象(object)

對象以左花括号“{”開始,以右花括号“}”結束(如:{"name":"wenxi"})。

5、true

隻能是true,不能寫作True、TRUE等。

6、false

隻能是false,不能寫作False、FALSE等。

7、null

隻能是null,不能寫作NULL等。

實際應用中,一個JSON資料包,要麼是一個JSON數組,要麼是一個JSON對象。其他JSON值,即數字、字元串、true、false、null等,通常作為數組或對象的元素出現。

3 JSON對象

一個JSON對象以“{”開頭,以“}”結束:

{ key:value,key1:value1… }

或中文表示:

{ 鍵:值,鍵1:值1… }

其中:

  1. 鍵(key)隻能是JSON字元串(string)。
  2. 值(value)可以是任意類型JSON值,包括JSON對象——這意味着JSON對象可以嵌套,即:一個JSON對象包含其他JSON對象。還可以包含JSON數組。
  3. 鍵、值分隔符“:”是英文冒号,前後可以有空格或其他空白字元。
  4. 鍵值對分隔符“,”是英文逗号,前後可以有空格或其他空白字元。最後一個鍵值對之後不能有分隔符“,”。

4 JSON數組

一個JSON數組以“[”開頭,以“]”結束:

[ value,value1,value2… ]

或中文表示:

[ 值,值1,值2…]

其中:

  1. 值可以是任意類型JSON值,包括JSON數組——這意味着JSON數組可以嵌套,即:一個JSON數組包含其他JSON數組。還可以包含JSON對象。
  2. 值分隔符“,”是英文逗号,前後可以有空格或其他空白字元。最後一個值之後不能有分隔符“,”。

5 JSON應用舉例

5.1 表字段存儲JSON資料(JSON數組)

一開始在wx_sleep表中,設計日期時間字段qy_time記錄每晚起夜時間:

從零開始學習JSON

實際一使用就發現,有起夜2次的情況。查知偶爾一晚起夜3次算正常,于是新增日期時間字段qy1_time、qy2_time:

從零開始學習JSON

學習JSON之後,發現用JSON數組可将所有起夜時間存儲到一個VARCHAR字段中(qy_notes)。再不用糾結qy_time字段個數了:

從零開始學習JSON

手搓兩條起夜資料,指定JSON格式顯示:

從零開始學習JSON

如果HeidiSQL顯示為一行,說明按JSON格式化資料失敗,即不是合法的JSON數組(末尾多了個“,”):

從零開始學習JSON

5.2 用JSON存放配置資料(JSON對象)

實際應用中,常用JSON儲存程式配置資訊。JSON配置資訊,可以看作是人向程式傳遞資訊的JSON資料包。

以下是Cryptomator程式的配置檔案settings.json:

從零開始學習JSON

從上圖可知,配置檔案settings.json中隻有一個JSON對象。這個對象中,與鍵"directories"對應的值,是一個JSON數組。這個數組包含了另一個JSON對象。

5.3 把JSON當資料庫使用(JSON數組)

JSON對象與對象、數組與數組以及對象與數組之間互相包含(即嵌套),不限層級,使得JSON極具生命力,應用十分廣泛。

比如,Markdown寫作軟體“妙筆”拿JSON當資料庫用:

從零開始學習JSON

由上圖可知,資料檔案doc_tree.json中隻有一個JSON數組。這個數組包含多個對象。其第一個對象中,與鍵"children"對應的值,是一個JSON數組,這個數組包含了多個JSON對象。

6 總結

JSON是一種協定。JSON協定資料包結構本質上隻有兩種:JSON對象和JSON數組。是以,JSON非常容易學習:

  1. 熟悉JSON值定義(七種),尤其是JSON字元串、JSON對象、JSON數組;
  2. 熟悉JSON對象嵌套、JSON數組嵌套以及兩者混合嵌套;
  3. 一個JSON協定資料包,要麼是一個JSON對象,要麼是一個JSON數組。