0 前言
很多年前就接觸過JSON,那是一份接口協定文檔,兩個子產品程式之間用JSON通信。
但是,直到最近,才學習JSON,學會用手搓、用aardio程式設計處理JSON資料等。究其原因如下:
- 拖延症已病入膏肓。
- 現有JSON學習資料,幾乎總與JavaScript、或者其他什麼語言攪和在一起,讓人望而生畏。
學會之後回頭再看,JSON,其實隻需要一篇小文章就能講清楚。
1 JSON協定
JSON本身是一種協定,與TCP/IP、UDP等網絡協定沒有本質上的不同,與JavaScript等語言也沒有必然聯系。
協定是用來規範通信資料格式的,以便協定雙方能夠順利交換資料(資訊),實作通信。
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… }
其中:
- 鍵(key)隻能是JSON字元串(string)。
- 值(value)可以是任意類型JSON值,包括JSON對象——這意味着JSON對象可以嵌套,即:一個JSON對象包含其他JSON對象。還可以包含JSON數組。
- 鍵、值分隔符“:”是英文冒号,前後可以有空格或其他空白字元。
- 鍵值對分隔符“,”是英文逗号,前後可以有空格或其他空白字元。最後一個鍵值對之後不能有分隔符“,”。
4 JSON數組
一個JSON數組以“[”開頭,以“]”結束:
[ value,value1,value2… ]
或中文表示:
[ 值,值1,值2…]
其中:
- 值可以是任意類型JSON值,包括JSON數組——這意味着JSON數組可以嵌套,即:一個JSON數組包含其他JSON數組。還可以包含JSON對象。
- 值分隔符“,”是英文逗号,前後可以有空格或其他空白字元。最後一個值之後不能有分隔符“,”。
5 JSON應用舉例
5.1 表字段存儲JSON資料(JSON數組)
一開始在wx_sleep表中,設計日期時間字段qy_time記錄每晚起夜時間:
實際一使用就發現,有起夜2次的情況。查知偶爾一晚起夜3次算正常,于是新增日期時間字段qy1_time、qy2_time:
學習JSON之後,發現用JSON數組可将所有起夜時間存儲到一個VARCHAR字段中(qy_notes)。再不用糾結qy_time字段個數了:
手搓兩條起夜資料,指定JSON格式顯示:
如果HeidiSQL顯示為一行,說明按JSON格式化資料失敗,即不是合法的JSON數組(末尾多了個“,”):
5.2 用JSON存放配置資料(JSON對象)
實際應用中,常用JSON儲存程式配置資訊。JSON配置資訊,可以看作是人向程式傳遞資訊的JSON資料包。
以下是Cryptomator程式的配置檔案settings.json:
從上圖可知,配置檔案settings.json中隻有一個JSON對象。這個對象中,與鍵"directories"對應的值,是一個JSON數組。這個數組包含了另一個JSON對象。
5.3 把JSON當資料庫使用(JSON數組)
JSON對象與對象、數組與數組以及對象與數組之間互相包含(即嵌套),不限層級,使得JSON極具生命力,應用十分廣泛。
比如,Markdown寫作軟體“妙筆”拿JSON當資料庫用:
由上圖可知,資料檔案doc_tree.json中隻有一個JSON數組。這個數組包含多個對象。其第一個對象中,與鍵"children"對應的值,是一個JSON數組,這個數組包含了多個JSON對象。
6 總結
JSON是一種協定。JSON協定資料包結構本質上隻有兩種:JSON對象和JSON數組。是以,JSON非常容易學習:
- 熟悉JSON值定義(七種),尤其是JSON字元串、JSON對象、JSON數組;
- 熟悉JSON對象嵌套、JSON數組嵌套以及兩者混合嵌套;
- 一個JSON協定資料包,要麼是一個JSON對象,要麼是一個JSON數組。