Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

JSONDecodeError 停在第 1 行第 1 欄?先檢查位元組再改解析器

字元零只說明失敗位置,不說明原因。先保留狀態碼、媒體類型、本文長度與安全位元組指紋,區分空本文、HTML、解碼或截斷,再修復產生端或呼叫端契約,並以有效、空與無效樣本驗收。

JSON 解析前的回應契約示意圖
原創插畫:呼叫 JSON 解析器前先驗證回應信封與位元組。 Watch at Ease

字元零只說明失敗位置,不說明原因。先保留狀態碼、媒體類型、本文長度與安全位元組指紋,區分空本文、HTML、解碼或截斷,再修復產生端或呼叫端契約,並以有效、空與無效樣本驗收。

JSON 文字必須包含一個序列化值;空白或空本文不是 JSON。 Python 在輸入不是有效 JSON 文件時拋出 JSONDecodeError。

1. 解析前固定回應信封

記錄方法、去識別 URL、狀態、重新導向、Content-Type、Content-Encoding、宣告長度、實收位元組數、執行環境與精確例外。政策允許時只保留本文雜湊及短去識別前綴,絕不記錄 token、Cookie 或完整個資。

本文只取用一次,並標明缺少、零位元組、純空白、HTML、類似 JSON 的文字或不可解碼位元組。不要在同一已耗用 stream 上呼叫 json()、text() 後又呼叫 json(),再把第二次失敗誤判為產生端故障。

2. 判定字元零處究竟是什麼

位置零為空或空白,通常指向無本文契約、過早關閉或遺失 payload。首位元組為小於號常表示登入頁、proxy 頁或錯誤頁 HTML。其他前綴可揭露錯誤 endpoint、BOM、編碼不符或壓縮問題。

把真正 JSON 開始後的語法錯誤與字元零失敗分開。記錄行、欄與絕對位置,但視為位置而非根因。驗證完整文件,因為尾端資料、截斷與串接多個 JSON 值需要不同修復。

3. 追蹤產生端與轉換鏈

從應用 handler 沿 middleware、proxy、cache、解壓器到 client library 追蹤回應。用 request ID 與時間戳關聯,但不複製秘密。確認哪一層設定狀態、媒體類型、編碼與本文,以及重新導向是否換了 endpoint。

對檔案要證明精確路徑、位元組長度、編碼與原子寫入邊界。新建空檔、過期暫存檔或同時半寫入不會因放寬解析器而修復;在下一次覆寫前保存失敗位元組。

4. 修復契約而不是掩蓋症狀

若成功回應依契約沒有表示,就明確建模該分支且不解析。若承諾 JSON,產生端必須回傳有效 JSON 值及正確 Content-Type;HTML 到達時修復驗證、proxy 或 routing;編碼與解壓問題在責任層修復。

只捕捉精確解碼例外,用於加入安全脈絡或轉成具型別契約錯誤。不要回傳空物件、重試所有語法錯誤或任意移除字元,這會隱藏資料遺失、重複副作用或上游故障。

5. 用三類樣本與可觀察失敗驗收

測試有效 JSON、預期無本文以及無效或錯誤媒體類型三類回應。有效樣本應解析成預期型別,空樣本應進入文件化的無內容分支,無效樣本應以具型別診斷及安全證據失敗。

在代表性流量下檢查解析錯誤率、本文長度分布、狀態與媒體類型不符、重新導向及重試。成功代表產生者與消費者一致、失敗可見、敏感本文未被記錄且回復方案明確。

JSON 解析失敗首位元組分類示意圖
原創插畫:字元零區分空本文、錯誤格式與損壞本文。 Watch at Ease