
如何修复 Gemini JSON 截断3 步让 json.loads 不再抛错【免费下载链接】generative-aiSample code and notebooks for Generative AI on Google Cloud, with Gemini Enterprise Agent Platform项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai你在 generative-ai 项目里让 Gemini 输出 JSON结果生成到一半就断了解析器当场报错——这就是典型的 Gemini JSON 截断。这篇排查指南带你看清 3 种成因、吃下 3 种修法读完你的解析链路就能稳定跑起来。现场还原json.loads 抛 JSONDecodeError 的那一刻先还原一个很有代表性的场景晚上十点多你跑完一次模型调用随手json.loads(response.text)终端立刻红了一片——JSONDecodeError: Expecting , delimiter。你按报错行号翻回去看数组写到第 19 条就停了最后一个右括号根本不存在。你的第一反应通常是怀疑自己的解析代码。做个小实验就能排除把response.text原样打印出来肉眼确认结尾是不是完整的。不完整就说明问题出在模型输出这一侧进入下面的排查。这种残缺 JSON 一旦流出去下游全遭殃前端拿不到数据界面只剩一张无结果占位图统计脚本少算一批记录自动化流水线卡死在这次调用上等你手动重启。诊断 Gemini 输出不完整三个常见症状诊断一每次都在差不多的长度处断开重试切点还不一样。真凶是输出令牌上限。Gemini 单次回复有 token 预算Flash 这类模型通常只有几千到八千。你的 JSON 超出预算模型就写到哪截到哪。打个比方这就像快递车装不下全部货司机只好把后半截卸在路边你收到的包裹永远缺斤少两。确认方法多跑几次看截断位置是否都卡在 token 预算附近。诊断二JSON 尾巴上多了话。比如结尾冒出以上是查询结果或者整段被包进 markdown 代码块。真凶是你没约束输出格式。自由文本模式下模型爱唠叨而json.loads对多余字符零容忍。确认方法检查文本里是否出现 或中文说明。诊断三函数调用的参数缺字段、不闭合。当你把大嵌套对象或长数组塞进一个函数参数时参数体积会撑爆输出空间最后半段参数直接被吞。确认方法对比function_call.args里的字段数是否比 schema 声明的少。gemini/function-calling/function_calling_data_structures.ipynb 里演示的正是这类复杂结构可以对照着看。三剂药方由轻到重 先看病情JSON 只是略大吃①格式老跑偏吃②数据量大到一次装不下吃③。药方①如何调高 Gemini 的输出上限适合谁JSON 只比默认输出多一截差几百个字符就能完整。from google import genai client genai.Client() r client.models.generate_content( modelgemini-2.0-flash, contents生成 200 个产品的 JSON 数组, configgenai.types.GenerateContentConfig( max_output_tokens8192, temperature0), ) print(r.text)temperature设 0 是为了让输出尽量确定减少差一点的重试。不够用的时候上限是模型自身的硬约束参数设得再大也不会突破数据太大时该截还是截。药方②结构化输出怎么开让模型闭嘴只交 JSON适合谁要每次拿到稳定 schema一个多余字符都不能忍。from google import genai from google.genai import types client genai.Client() schema types.Schema(typetypes.Type.OBJECT, properties{products: {type: types.Type.ARRAY, items: {type: types.Type.OBJECT}}}, required[products]) r client.models.generate_content( modelgemini-2.0-flash, contents生成 20 个产品数据, configtypes.GenerateContentConfig( response_mime_typeapplication/json, response_schemaschema)) print(r.text)你把 schema 画好模型被锁死在里面只能往里填数据多一个字都出不来。偏好用强制函数调用达到同样效果的可以看 gemini/function-calling/forced_function_calling.ipynb。不够用的时候schema 保格式、不保数量数据量太大时输出照样被截。药方③几千条数据怎么分片生成适合谁数组动辄上千条单次调用物理上装不下。import json from google import genai client genai.Client() def build_big_json(total5000, chunk500): items [] for i in range(0, total, chunk): r client.models.generate_content( modelgemini-2.0-flash, contentsf生成第 {i}~{i chunk - 1} 条产品数据只输出 JSON 数组, configgenai.types.GenerateContentConfig(max_output_tokens8192)) items json.loads(r.text) return {total: len(items), data: items}把大数组拆成小块逐片生成、逐片解析、再拼回。建议每个分片都套上药方②的 schema结构更稳拼接完成后再整体校验一次total是否等于预期条数。不够用的时候调用次数和等待时间线性上涨需要你的业务逻辑能接受生成—校验—拼接这个流程。三个修复方案怎么选药方适用场景改动成本局限① 调高输出上限JSON 略大、偶发截断改一个参数顶不过模型硬上限② 结构化输出schema 必须稳定、格式常跑偏加一段 config只保格式不保数量③ 分片生成数千条的超大数据写循环和拼接调用变多、延迟变长复诊如何给 JSON 解析加一层兜底⚠️ 上面手段全做完也不能 100% 保证每次解析都成功。关键链路上建议给解析加个容错import json def safe_parse(text): candidates [text] if not text.rstrip().endswith((}, ])): candidates.append(text.rstrip() }) for t in candidates: try: return json.loads(t) except json.JSONDecodeError: continue return None先直接解析失败后再尝试补一个右括号只救少一个括号这种轻症。拿到None说明这份输出已不可用正确动作是把分片改小、重新调用循环到成功为止。顺手把原始文本落一份日志方便事后分析模型到底断在哪。先上哪个方案Gemini JSON 截断选型建议✅ 一句话结论默认先上药方②它成本最低、从源头消灭格式问题当数据量大到单次装不下再叠加药方③分片生成。药方①更适合顺手加上很少单独够用。更多基础用法参考项目里的 gemini/function-calling/intro_function_calling.ipynb 和 gemini/README.md。【免费下载链接】generative-aiSample code and notebooks for Generative AI on Google Cloud, with Gemini Enterprise Agent Platform项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考