模型 JSON 同一个键出现两次,为什么解析成功也不能直接采用

2026-10-24

模型返回 {"status":"approved","status":"rejected"},Python 默认解析可以成功,但业务状态已经不唯一。若检查发生在字典建立以后,前一个值可能早已被覆盖。要发现这种问题,必须在对象仍是键值对序列时检查,而不是对最终字典数一遍键。

语法可读与含义唯一不同

Python json 文档说明默认解码允许重复名称并保留最后一个值。这是解析器行为,不能变成业务采纳依据。本文的客户端合同更严格:同一对象作用域内一个字段只能出现一次,无论两个值是否相同都拒收。字段重复往往意味着上游拼接、协议适配或模型结果出了问题,自动选一个值会掩盖来源。

object_pairs_hook 在解码对象时获得有序键值对。钩子逐项建立集合,发现已出现的键立即抛出明确错误,然后才构造字典。它会处理嵌套对象,所以不能只在最外层扫原始字符串;字符串内容里的冒号和引号也不是字段边界。

四条输入明确作用域

附件包含顶层重复、嵌套重复、数组里两个独立对象都具有 id 字段,以及普通唯一字段对象。前两条拒绝,后两条通过。不同对象重复使用同一个字段名是正常结构,不能使用全局键集合,否则每一行都有 id 的列表都会被误伤。

失败反例是先执行 json.loads,再比较字典长度与键集合长度。二者此时本来就相同,无法重建被覆盖的值。另一种用正则抓所有双引号词语的方法,会把字符串内容和嵌套层次混在一起,既漏报又误报。附件检查器实际使用标准解码钩子,不靠文本搜索猜结构。

错误处理不要自行裁决业务

捕获到重复键后,记录样本编号、错误类型与安全的原文表示,停止进入入库和工具执行。原文可能包含敏感数据,应按项目留样策略处理;不要在每次异常时完整打印线上响应。本文样本全为合成状态,没有真实客户字段。

若希望输出完整字段路径,单个对象钩子不足以直接提供父路径,可以采用保留对象节点的解析方式再遍历,或使用支持位置诊断的解析器。不要把只返回键名的示例冒称为精确行列定位器。本文验证只保证拒绝重复和作用域正确,错误文本不承诺原文坐标。

Structured Outputs 提供结构约束的能力,仍需按实际响应状态与客户端读取方式验收;这里并不声称官方服务会生成这些坏例子。即使上游已有强约束,对缓存、手工文件或兼容接口的入口设置独立检查,仍有助于防止不同解析器给出不同业务结论。

配套文件与依据

本文的合成输入和参考结果可下载独立样本 a009.json,离线检查器 a009.py与样本放在同一目录后运行。检查器不调用模型接口。 使用 Python 3.12 或兼容版本,将上述文件下载到同一目录,执行 python a009.py。

一手资料1;一手资料2。资料核对日期:2026-10-24。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。

加微信,把这一页存到手机上

扫码加站长企业微信,会自动把这一页的链接发给你,方便在手机上接着看。AI 落地卡住了,也可以直接问。

去留微信

留言讨论

评论发布后会被人工复核,违规内容将被删除。

    还没有人评论,来说说你的看法

    如果发表没有反应,可以前往联系我们告诉我们。

    这个页面有问题?

    提交时会附带当前页面地址和浏览器信息,帮助我们定位问题。不填联系方式即为匿名。