標籤:

「每日一題」JSON 是什麼?

(本文精髓在最後一節)

JSON 絕對不是對象,請問

  1. JSON 是什麼?
  2. "null" 是 JSON 嗎?"1" 是 JSON 嗎?

  3. JSON 與 JS 對象的區別是什麼?

JSON 是什麼?

如果你在 Google 搜索 JSON,那麼一眼就會看到 JSON 的官網 json.org

官網會明明白白的告訴你,JSON 是一種數據格式。

什麼是格式?你可以理解為語法。JSON 的格式靈感來自於 JS 對象字面量的語法,但是兩者沒有任何關聯。

這種格式可以描述三種數據。

1. object(無序的「鍵-值」集合)。

語法如下:

這個圖叫做語法圖,你可以講其想像成鐵軌,有一列火車從左往右行駛。

這列火車遇到的第一個符號是 { ,所以對象語法的第一個符號也必須是 { 。

如果繼續直行,會分別遇到 string、冒號和 value,所以對應的文本內容是 { string: value 。

然後你可以選擇直行或者往下拐,最後到達終點。

把旅途中遇到的所有符號連起來,就是完整的語法。

比如下面三種寫法都可以表示 object

{}n{"key1": "value1"} // string 對應 "key1",value 對應 "value1",後面會講n{"key1": "value1", "key2": "value2"}n

2. array(有序的值集合)

語法如下:

下面三種寫法都可以表示 array

[]n[1]n[1,"hi"]n

3. value

value 對應對象語法圖裡的 value 和數組語法圖裡 value,value 也可以是 object 或 array,所以下面的語法成立:

{"key1": { "key2" : "value2" } }n[ 1, [ 2, 3 ] ]n

另外值還可以是 string、number、true、false 和 null。

string 的語法如下:

你可能奇怪為什麼 string 的語法這麼複雜,我舉例來說明你就明白了:

"你好"n""你好""n"你好"n"/你好/"n"bfnrt特殊符號"n"你用編碼表示字元"n

上面都是合法的 string。這也是「JSON 中字元串必須使用雙引號」的原因——規定如此。

number 的語法如下,有興趣可以自己走一遍:

另外需要特殊提醒一下,true、false 和 null 都是合法的 JSON。

JSON 和 JS Object 的區別

簡單來說,兩種沒有任何關聯。

JSON 語法的作者是道格拉斯(Douglas Crockford),JS 語法的作者是布蘭登?艾奇(Brendan Eich)。道格拉斯發明 JSON 的時候參考了 JS 的對象語法,僅此而已。

如果硬要說區別:

1. JSON 的字元串必須用雙引號。

2. JSON 無法表示 undefined,只能表示 "undefined"

3. JSON 無法表示函數

4. JSON 的對象語法不能有引用

以上,就是對 JSON 的詳細介紹。

更多前端知識,盡在前端交流 4 群:392054247

本文看似是在說 JSON,實際上在說什麼?

實際上我想告訴一些初學者,不要「道聽途說」學編程。

你聽別人說 JSON 是一種數據格式,你就信了,也不去 Google 一下,也不去找一下 JSON 的出處、發明者和規格文檔,你只是在「道聽途說學編程」,這是很蠢的行為。

推薦閱讀:

如何從CFG轉換到State Machine?
乾貨 | 劫持各個瀏覽器中的JSON漏洞
【原創】R語言轉換並保存json文件--使用jsonlite包
json 在 Python 爬蟲的應用

TAG:JSON |