REST API返回JSON的键列表不一致,求原因分析
问题背景
我使用requests库从REST API获取JSON响应,代码如下:
import json import requests response = requests.get(url, params=payload, auth=(user, pwd), headers=headers ) data = response.json() with open(completeName, 'w+') as fd: json.dump(data, fd, indent=4)
生成的JSON文件内容显示,records数组里的部分记录键存在差异:
{ "records": [ { "parent": "", "caused_by": "", "watch_list": "", "u_closure_code": "" }, { "parent": "", "caused_by": "", "watch_list": "" } ] }
比如第一条记录有u_closure_code字段,第二条却没有,这可能是什么原因呢?
结合实际开发经验,这种情况通常由以下几个原因导致:
后端数据源本身存在差异
多数REST API是从数据库或其他数据源动态生成JSON响应的,如果部分记录的某些字段本身无值(甚至在数据源中该字段就不存在),后端为了压缩响应体积,通常会选择省略空值字段。你示例里的第二条记录没有u_closure_code,大概率是这条记录在后端数据库中该字段为空,因此被跳过输出。API版本或请求参数的影响
如果你调用的API存在多版本差异,或者同一个端点支持通过参数控制返回字段(比如代码里的payload可能包含fields这类参数),不同的请求逻辑可能返回不同的字段集合。可以检查下你的payload参数,是否设置了部分字段返回,导致不同属性的触发了不同的返回规则。API根据记录属性动态返回字段
有些API会根据记录的状态、类型等属性动态调整返回字段。比如u_closure_code这个字段,可能仅在记录处于“已关闭”状态时才会返回,未关闭的记录则不包含该字段。这种动态逻辑下,不同属性的记录自然会有不一致的键列表。后端序列化规则的差异
后端将数据转换为JSON时,使用的序列化库可能默认配置为忽略空值;或者后端针对不同类型的记录使用了不同的序列化器,导致输出的JSON结构不一致。不过你的代码只是直接解析并保存响应,因此代码本身不会造成这个问题。
验证小技巧
- 用
curl或Postman直接调用该API,确认原始响应是否就存在这个差异(排除代码处理的问题)。 - 查阅该API的官方文档,看看是否有关于动态返回字段的说明。
内容的提问来源于stack exchange,提问作者Rishabh Awasthi

