escape、Unicode、數字精度 — Strings & Numbers
字串內要用反斜線 \ 跳脫特殊字元。JSON 支援的跳脫有限:
"\" # 雙引號 "\\" # 反斜線 "\n" # 換行 "\t" # Tab "\r" # 回車 "\b" # 退格 "\f" # 換頁 "\uXXXX" # Unicode,如 \u00e9 = é
{ "quote": "他說:\"嗨\"", "lines": "第一行\n第二行", "unicode": "caf\u00e9" }
quote → 他說:"嗨"
lines → 第一行
第二行
unicode → café
\n。
JSON 支援 Unicode,中文可以直接寫(UTF-8),也可以用 \uXXXX 轉義。
兩者讀出的結果相同。
{ "直接": "繁體中文", "轉義": "\u7e41\u9ad4\u4e2d\u6587" }
兩者都讀出「繁體中文」。某些工具會把非 ASCII 全部轉成 \u(避免編碼問題),例如 Python 的 ensure_ascii=True。
JSON 數字規則比你想的更嚴格:
42 # 整數 -3 # 負數 3.14 # 小數 6.02e23 # 指數(e 或 E) 0.5 # 可(0 不能省) # 以下都是非法: .5 → 前導 0 不可省 3. → 尾端點號不可 01 → 前導零不可 +3 → 正號不可 0xFF → 十六進位不可 NaN / Infinity → 不可
JSON 規格不限定數字大小,但讀取方(多為 double)有精度上限:
# 超過 2^53 的整數(約 9e15)可能失真: { "id": 9007199254740993 } # JS 讀出後可能變成 9007199254740992 # 常見解決:大數用字串 { "id": "9007199254740993" }
true / false。True、TRUE 都非法。null 也是小寫。NULL、None 都非法。null 與「欄位缺失」是兩回事——前者是「值為空」,後者是「沒有這個鍵」。\uXXXX。