forked from Ikalus1988/MisakaNet
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlesson-json-parse-failure-handling.json
More file actions
16 lines (16 loc) · 1.51 KB
/
Copy pathlesson-json-parse-failure-handling.json
File metadata and controls
16 lines (16 loc) · 1.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"task_id": "lesson-json-parse-failure-handling",
"title": "JSON 解析失败处理 — 截断 / 格式错误",
"domain": "devops",
"tags": [
"json",
"parse",
"truncated",
"llm",
"output"
],
"problem": "从 LLM 输出或 API 返回中解析 JSON 时报 `json.decoder.JSONDecodeError`。常见于模型输出被截断、前后有多余字符。",
"solution": "```python\nimport json\nimport re\n\ndef safe_json_parse(text: str) -> dict | None:\n \"\"\"尝试多种策略解析 JSON\"\"\"\n \n # 策略 1:直接解析\n try:\n return json.loads(text)\n except json.JSONDecodeError:\n pass\n \n # 策略 2:提取代码块中的 JSON\n m = re.search(r'```(?:json)?\\s*\\n?(.*?)\\n?```', text, re.DOTALL)\n if m:\n try:\n return json.loads(m.group(1))\n except json.JSONDecodeError:\n pass\n \n # 策略 3:提取第一个 { } 间的完整内容\n m = re.search(r'(\\{.*\\})', text, re.DOTALL)\n if m:\n try:\n return json.loads(m.group(1))\n except json.JSONDecodeError:\n pass\n \n # 策略 4:使用 strict=False(允许控制字符)\n try:\n return json.loads(text, strict=False)\n except json.JSONDecodeError:\n pass\n \n return None\n\n# 使用\nresult = safe_json_parse(model_output)\nif result is None:\n print(\"JSON 解析失败,尝试重新生成\")\n```",
"source": "lessons/contrib/json-parse-failure-handling.md",
"test_cmd": ""
}