Python `json.loads` 的 `strict=True / False` 快速指南 \n vs \\n ; \t vs \\t 那一個是合法json?

加入好友
加入社群
Python `json.loads` 的 `strict=True / False` 快速指南 n vs \n ; t vs \t 那一個是合法json? - 儲蓄保險王

`json.loads()` / `json.load()` 有個 `strict` 參數,**預設 `True`**。它只管一件事:

**字串值裡能不能出現「未跳脫的控制字元」**——也就是「換行字元本身、tab 字元本身」

(按 Enter/Tab 直接打進去的那個字元),而不是 `\n`、`\t` 這種跳脫寫法。

json.loads(s, *, strict=True)   # 預設
Python `json.loads` 的 `strict=True / False` 快速指南 n vs \n ; t vs \t 那一個是合法json? - 儲蓄保險王

一個例子看懂

import json

# 字串值裡有換行字元本身」( Enter 打進去的不是 \n 跳脫寫法)→ 不合法 JSON
bad = '{"description": "line1\nline2"}'

json.loads(bad)                 # ❌ JSONDecodeError: Invalid control character...
json.loads(bad, strict=False)   # ✅ {'description': 'line1\nline2'}
Python `json.loads` 的 `strict=True / False` 快速指南 n vs \n ; t vs \t 那一個是合法json? - 儲蓄保險王

正確做法是把換行「跳脫」成 \n(兩個字元 \ + n),這樣連 strict=True 都沒問題:

good = '{"description": "line1\\nline2"}'   # 合法 JSON

json.loads(good)                # ✅ 不必 strict=False
Python `json.loads` 的 `strict=True / False` 快速指南 n vs \n ; t vs \t 那一個是合法json? - 儲蓄保險王

good 與 bad 解析出來的結果完全一樣,差別只在「來源文字合不合法」。 strict=False 本質就是「寬容地把 bad 當 good 來讀」。


什麼是「控制字元」?

ASCII 0x000x1F 的不可見字元,常見:

Python `json.loads` 的 `strict=True / False` 快速指南 n vs \n ; t vs \t 那一個是合法json? - 儲蓄保險王

JSON 標準要求它們必須跳脫;直接塞真字元進字串值就是不合法。


三個關鍵觀念

  1. strict 只管控制字元——它不會修復其他錯誤(少括號、多逗號、key 沒引號、Extra data…)。那些在 True / False 下都一樣失敗。
  2. 和 encoding 無關——encoding 是「bytes → 文字」的解碼(失敗是 UnicodeDecodeError);strict 是「文字 → JSON」的解析(失敗是 JSONDecodeError)。兩個不同階段。
  3. 救回來的字元還在——strict=False 只是允許解析,不會刪字元。真的換行會變成字串裡的一個 \n 字元;不想要得自己 .replace()

建議用法

try:
    data = json.loads(text)                 # 先嚴格乾淨檔正常過
except json.JSONDecodeError:
    data = json.loads(text, strict=False)   # 失敗才寬鬆救含控制字元的髒檔
    print("⚠️ loaded with strict=False")     # 留個痕跡知道這檔不乾淨

為什麼不一開始就 strict=False 先嚴格能讓「不乾淨的檔」被標記出來(利於追蹤品質);一律寬鬆會把問題悄悄吞掉, 而且對非控制字元的錯誤根本沒幫助。


一句話總結

strict=False = 「允許字串內含未跳脫的控制字元」。只放寬這一條,其餘 JSON 規則照舊。 能產出合法 JSON 最好,就完全用不到它。

推薦hahow線上學習python: https://igrape.net/30afN

加入好友
加入社群
Python `json.loads` 的 `strict=True / False` 快速指南 n vs \n ; t vs \t 那一個是合法json? - 儲蓄保險王

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

You may also like...

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *