DeepSeek不直接处理JSON,需代码兜底:先校验content是否为合法JSON字符串,再用try/except解析;递归提取时须同时处理dict和list;扁平化宜用点分路径并防key冲突;启用JSON模式前须确认模型支持。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

DeepSeek 本身不直接“处理”JSON——它生成或理解JSON,但解析、扁平化、提取字段这些事得靠你写的代码来兜底。模型输出是否结构化,取决于你如何约束它;而拿到嵌套JSON后能否快速取数、转格式、防崩溃,则取决于你用的工具链和写法。
deepseek API返回的嵌套JSON怎么安全取值?
API响应里choices[0].message.content可能是纯文本,也可能是带引号包裹的JSON字符串(比如"{\"name\":\"Alice\",\"score\":{\"math\":95}}"),直接json.loads()会报JSONDecodeError。
- 先检查
content是不是合法JSON字符串:用content.strip().startswith('{')或content.strip().startswith('[')粗筛,再用try/except json.JSONDecodeError兜底 - 别信
function_call.arguments字段一定可解析——它常是未转义的JSON字符串,需额外json.loads(arguments)一次 - 如果模型返回了Markdown代码块(如
{...}),得先用正则提取json标签内的内容,再解析
递归提取嵌套字段时为什么总漏数据?
常见错误是只遍历dict,忽略list里的对象。比如{"users": [{"id": 1}, {"id": 2}]},若只处理顶层dict,id就取不到。
- 必须同时处理
dict和list两种容器类型,且对list中的每个元素递归调用提取函数 - 避免用
isinstance(value, dict)后直接.items()——value可能是None,先判空 - 提取多层路径(如
data.user.profile.id)时,建议用dict.get()链式调用或第三方库glom,比手写try/except更稳
怎么把深层嵌套JSON转成扁平字典?
点分路径扁平化不是为了好看,而是让Pandas能直接pd.DataFrame([flat_dict]),也让数据库字段映射不崩。
- 递归函数里,每下一层就拼接当前key,遇到叶子节点(非
dict/list)才写入结果字典 - 注意key冲突:如
{"a": {"b": 1}, "a.b": 2}扁平后都是a.b,需加前缀或跳过重复键 - 数组索引要显式保留:
items[0].name比items.name更可靠,否则多个元素会覆盖
启用JSON模式后还是返回乱码?
不是所有DeepSeek模型版本都支持response_format={"type": "json_object"}。v3-0324、R1-Distill-Llama-8B等较新模型可用,但早期V2或社区微调版可能直接忽略该参数。
- 先查文档确认所用模型是否在
json_mode支持列表中,别只看模型名 - 即使启用了JSON模式,
system提示词仍要写死约束:“只输出合法JSON,无注释、无说明、无代码块标记” - 某些SDK(如
openai-python)会自动给content加引号,导致双重JSON字符串,需在解析前做json.loads(json.loads(content))
最易被忽略的一点:嵌套深度超过Python默认递归限制(通常1000层)时,json.loads()或自定义递归函数会抛RecursionError。生产环境务必用sys.setrecursionlimit()预设,或改用迭代写法处理超深结构。











