JSON 字段缺失、null 和 false,别用一个 if 全判断了

举报
某酱 发表于 2026/11/02 11:00:19 2026/11/02
【摘要】 接口返回没有某个字段、明确返回 null、返回 false,以及返回数字 0,通常需要不同处理。用 Python 的固定 JSON 示例说明存在性、类型和值应该分别检查。

读取接口数据时,很容易写出这样的判断:

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 模块文档
真假值与布尔类型:内置类型的真假值测试章节

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。