JSON 字段缺失、null 和 false,别用一个 if 全判断了
读取接口数据时,很容易写出这样的判断:
if not data.get("enabled"):
print("未开启")
这段代码很短,但它把几种不同的输入放进了同一个分支:
{}
{"enabled": null}
{"enabled": false}
{"enabled": 0}
第一个没有 enabled 字段。第二个字段存在,值是 null。第三个是布尔值 false。第四个是数字 0。这些输入在一个具体接口里分别代表什么,应以接口文档为准,不能单凭真假判断替它们定义业务含义。
Python 的 json.loads() 会把 JSON 的 null 转换为 None,把 false 转换为 False。缺失键调用不带默认值的 dict.get(),也会得到 None。随后使用 if not value,又会让 None、False、数字零等值进入同一个分支。
可以用一个独立的标记区分字段是否存在,再按约定检查类型:
import json
MISSING = object()
def describe(payload):
data = json.loads(payload)
if not isinstance(data, dict):
return "顶层不是对象"
value = data.get("enabled", MISSING)
if value is MISSING:
return "字段缺失"
if value is None:
return "字段为 null"
if type(value) is not bool:
return "字段类型不是 bool"
return "开启" if value else "关闭"
for payload in [
'{}',
'{"enabled": null}',
'{"enabled": false}',
'{"enabled": 0}',
'{"enabled": true}',
]:
print(describe(payload))
输出依次为:
字段缺失
字段为 null
关闭
字段类型不是 bool
开启
这个例子假设 enabled 一旦有明确值,就必须是布尔类型。若接口允许用 0 和 1 表示状态,应按它的规范转换,而不是直接照搬示例。
这里使用 type(value) is bool,是为了表达严格的布尔字段约束。另一个容易忽略的细节是,Python 中布尔类型属于整数类型的子类,因此仅用 isinstance(value, int) 检查计数值时,还可能把 True 当作整数接收。类型检查也要和字段约定对应起来。
真正接入接口时,还需要把传输和解析错误放在字段判断之前。连接超时没有产生有效业务结果;无效 JSON 无法进入正常字段校验;缺失字段也不自动等于某个业务状态。将这些情况分别记录,日志才能说明究竟是哪一步出了问题。
这个区别也适用于表单和局部更新接口:字段不提供、字段提供为空、字段提供为假,可能触发不同的处理。先判断是否出现,再判断类型,最后解释值,能让后续逻辑清楚很多。
参考:Python 官方文档
JSON 解码与类型映射:json 模块文档
真假值与布尔类型:内置类型的真假值测试章节
- 点赞
- 收藏
- 关注作者
评论(0)