json解析失败主因是结构不可控,需前中后三阶段硬控制:提示词层字段锁定+格式封边+自检指令;调用层协议对齐;解析层防御性清洗与延迟解析;验证层校验语义完整性。

模型输出的 JSON 字段解析失败,核心问题不是“格式错”,而是“结构不可控”——大模型按概率生成文本,天然会加解释、套代码块、漏括号、混用单双引号,甚至返回 HTML 或空响应。解决关键在于:不依赖模型自觉,而靠前中后三阶段硬控制。
一、提示词层:强制纯净输出
仅写“请返回 JSON”无效。必须叠加三层约束:
-
字段锁定:明确每个 key 名、类型、取值范围,例如
"status": "success" | "error",禁用自由发挥 -
格式封边:要求开头无说明、结尾无换行,禁止 Markdown 包裹(如
```json)、禁止自然语言前缀(如“好的,这是结果:”) - 自检指令:在提示末尾加一句:“输出前,请逐字检查:是否仅含一个合法 JSON 对象?所有字符串是否用英文双引号?是否无尾逗号?校验通过再返回。”
二、调用层:协议与参数对齐
很多失败源于客户端与服务端通信错位:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- Ollama 模型需显式启用 JSON 模式:
ollama run llama3 --format json,否则默认输出自然语言 - OpenInterpreter 等工具调用时,
api_base必须带/v1路径,例如"http://localhost:11434/v1",否则走非兼容接口 - 若用流式(stream: true),不能直接
json.loads()原始响应体,需先按 SSE 协议拼接完整内容,再解析
三、解析层:防御性处理兜底
永远假设输入不可信,解析前做轻量清洗和校验:
- 用
bytes.Contains(body, []byte(`"choices"`))快速判断是否为有效 OpenAI 响应,避开 HTML 错误页或空响应 - 遇到非法 Unicode(如零宽空格、BOM 头),用正则清理:
re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]', '', text) - 对关键字段(如
choices[0].message.content)用json.RawMessage延迟解析,避免结构体 panic 中断整个流程
四、验证层:结构契约比语法更重要
JSON 语法正确 ≠ 业务可用。需额外校验语义完整性:
- 检查必需字段是否存在:
if _, ok := data["id"]; !ok { /* 缺失主键 */ } - 验证数组长度:
if len(data["items"].([]interface{})) == 0 { /* 空列表需特殊处理 */ } - 布尔值统一小写:
if v, ok := data["enabled"]; ok && v == "true" { enabled = true },兼容字符串型布尔










