這份教學示範如何對「看起來像 JSON、但其實不合法」的 OCR sidecar 內容做三段式處理:
1. 先嘗試 `json.loads`
2. 失敗後再嘗試 `json_repair`
3. 若仍失敗,最後保留原始字串 `raw_string_fallback`
這個順序的目的,是讓原本已經合法的 JSON 完全不被多餘修補;只有在標準解析失敗時,才啟用 best-effort repair。
## Install
pip install json-repair## A Simplified Broken Example
下面這段內容故意保留兩個常見問題:
– 少了最外層 `{}`
– 結尾多一個逗號
bad_json_text = '''
"step_01": {
"class_name": "DemoProcessStep",
"action": {
"bypass": "false"
},
},
'''.strip()## Standard Parse First, Then Repair
import json
import json_repair
try:
ocr_json_best_effort = json.loads(bad_json_text)
ocr_json_parse_stage = "json.loads"
except json.JSONDecodeError:
try:
ocr_json_best_effort = json_repair.loads(bad_json_text)
ocr_json_parse_stage = "json_repair"
except Exception:
ocr_json_best_effort = bad_json_text
ocr_json_parse_stage = "raw_string_fallback"
print("parse_stage =", ocr_json_parse_stage)
print(type(ocr_json_best_effort).__name__)
print(ocr_json_best_effort)## Expected Outcome
在這個例子中:
– `json.loads` 會失敗
– `json_repair` 會成功
– `ocr_json_parse_stage` 會是 `json_repair`
輸出通常會是修補後的 Python `dict`,例如:
parse_stage = json_repair
dict
{‘class_name’: ‘DemoProcessStep’, ‘action’: {‘bypass’: ‘false’}}

## Recommended Field Contract
如果你要把這套流程存進主輸出 JSON,建議欄位分成三個:
– `ocr_json_raw`: 原始 OCR sidecar 文字
– `ocr_json_best_effort`: 經 `json.loads -> json_repair -> fallback` 後的最終表示
– `ocr_json_parse_stage`: 記錄最後命中的解析階段,值可能是 `json.loads`、`json_repair`、`raw_string_fallback`
這樣可以同時保留:
– 原始證據
– 可用的最佳努力物件
– 修補可信度資訊
推薦hahow線上學習python: https://igrape.net/30afN


![Python: pandas.DataFrame (df) 的取值: df [單一字串] 或df [list_of_strings] 選取一個或多個columns; df [切片] 或 df [bool_Series] 選取多個rows #bool_Series長度同rows, index也需要同df.index ,可以使用.equals() 確認: df.index.equals(mask.index) Python: pandas.DataFrame (df) 的取值: df [單一字串] 或df [list_of_strings] 選取一個或多個columns; df [切片] 或 df [bool_Series] 選取多個rows #bool_Series長度同rows, index也需要同df.index ,可以使用.equals() 確認: df.index.equals(mask.index)](https://i0.wp.com/savingking.com.tw/wp-content/uploads/2025/04/20250420212553_0_6fb2c3.png?quality=90&zoom=2&ssl=1&resize=350%2C233)
![Python TQC考題910 學生基本資料, print(line.decode(“utf-8”)), if line.decode(“utf-8″).split()[2] ==”0”: female += 1 Python TQC考題910 學生基本資料, print(line.decode(“utf-8”)), if line.decode(“utf-8″).split()[2] ==”0”: female += 1](https://i2.wp.com/savingking.com.tw/wp-content/uploads/2022/05/20220514163621_72.png?quality=90&zoom=2&ssl=1&resize=350%2C233)






近期留言