跳到主要內容

← 返回部落格

JSON 是什麼?5 分鐘看懂結構與常見錯誤

JSON(JavaScript Object Notation)是網路上最常見的資料交換格式。API 回傳它、設定檔用它、日誌裡到處是它。雖然名字裡有 JavaScript,它其實與語言無關 —— Python、Go、Java 幾乎所有語言都能讀寫。5 分鐘帶你搞懂。

你可以自己跑一次對照。{"id":42,"tags":["draft","zh"],"meta":{"ok":true,"score":9.5},"note":null} 貼進我們的 JSON 格式化工具 按「美化」。它會回給你兩個空格的縮排、鍵的順序原封不動、9.5 仍然是數字、null 仍然是 null —— 不重排、不轉型。這一組輸入與輸出每次建置都有腳本逐字比對,所以萬一工具行為改了,這一頁就會是錯的,而我們會立刻知道。

基本組成

一份 JSON 由幾種型別組成:

  • 物件(Object) —— 用大括號包起來的鍵/值對:{ "name": "Ada", "age": 36 }
  • 陣列(Array) —— 用中括號包起來的有序清單:[1, 2, 3]
  • 字串(String) —— 用引號括起來的文字:"hello"
  • 數字(Number) —— 423.14-7(不加引號)
  • 布林(Boolean) —— truefalse
  • null —— 明確的空值

物件與陣列可以互相巢狀到任意深度,JSON 就是這樣表示複雜資料的。

一個簡單範例

{
  "user": "ada",
  "active": true,
  "roles": ["admin", "editor"],
  "profile": { "age": 36, "city": "London" }
}

這是一個物件,包含字串、布林、字串陣列,以及一個巢狀物件。

最容易踩雷的規則

大多數「JSON 無效」的錯誤來自這幾個地方:

  1. 多餘的逗號。 [1, 2, 3,] 在 JavaScript 有效,但在 JSON 無效,要移除最後一項後面的逗號。
  2. 單引號。 JSON 的鍵與字串值都必須用雙引號。{'name': 'Ada'} 無效,必須是 {"name": "Ada"}
  3. 鍵沒加引號。 {name: "Ada"} 是 JavaScript 物件字面值,不是 JSON。鍵必須是加引號的字串。
  4. 註解。 JSON 沒有註解語法,// 像這樣 會導致解析錯誤。
  5. 值的型別錯誤。 數字與布林不該加引號,除非你真的要它們當字串。

這些規則,用「它們會產生什麼錯誤」來記更容易。我們把四種「差一點就是 JSON」的東西餵進自己的 JSON 格式化工具,把回傳的內容原樣記下來。尾隨逗號給的是

✗ JSON syntax error: Expected double-quoted property name in JSON at position 7 (line 1 column 8) [L1:8]

單引號給的是

✗ JSON syntax error: Expected property name or '}' in JSON at position 1 (line 1 column 2) [L1:2]

沒加引號的鍵給的是

✗ JSON syntax error: Expected property name or '}' in JSON at position 1 (line 1 column 2) [L1:2]

而 JavaScript 的 undefined 給的是

✗ JSON syntax error: Unexpected token 'u', "{"a":undefined}" is not valid JSON

注意單引號和「沒加引號的鍵」產生的是同一句訊息、在同一個位置:解析器並不是在找引號的種類,它在找一個以雙引號括起來的屬性名,並回報第一個找不到的地方。

如何快速修好壞掉的 JSON

當程式丟出解析錯誤,最快找出問題的方法是把文件丟進驗證器。貼進 JSON 格式化工具:語法有錯它會指出大概位置並告訴你原因;語法正確後,按「美化」看清楚結構,或按「壓縮」在送出前縮小體積。

這也是修壞掉 JSON 最快的方法:讀位置,不要讀敘述。✗ JSON syntax error: Expected double-quoted property name in JSON at position 7 (line 1 column 8) [L1:8] 指的是第 1 行第 8 欄 —— 最後那個逗號後面的字元 —— 所以要改的地方在那個逗號上,比回報的位置早一格。解析器回報的是它放棄的地方,不是你犯錯的地方,而這兩個幾乎從來不是同一個字元。

什麼時候(不)該用 JSON

JSON 很適合設定檔與 API 資料。但它不適合非常龐大的資料集(串流或二進位格式更有效率),也不適合需要註解的文件(YAML 或 TOML 更友善)。不過對絕大多數網頁工作來說,JSON 就是通用語言 —— 現在你已經能流利地讀懂它了。

想整理一下 JSON?試試免費的 JSON 格式化工具 —— 全程在瀏覽器執行,資料不外傳。