JSON 里的 null、缺失字段和空字符串:别再混淆
null 是显式的「值为空」,字段缺失是「没有这个值」,空串是「值为空文本」。讲清三者在各语言解析中的差异与接口设计建议。
一、三种状态
- null:
{"nickname": null}——字段存在,值显式为空。 - 缺失:
{"name": "a"}——根本没有 nickname 这个键。 - 空字符串:
{"nickname": ""}——值存在且是空文本。
三者语义完全不同:null 常表示「未知/不适用」,缺失常表示「未提供」,空串表示「明确填了空」。
二、各语言解析差异
- JavaScript:
obj.nickname对 null 和 undefined(缺失)都走 falsy 分支,但null !== undefined,严格比较要区分。 - Python:null →
None;dict.get('nickname')缺失与 null 都返回 None,只有'nickname' in obj能区分。 - Java/Jackson:字段缺失不调用 setter(保持默认值),null 显式置空——POJO 里两者表现不同。
三、接口设计建议
- 明确约定:可选字段「没值就别传」还是「传 null」,团队内统一,写进接口文档。
- 更新场景用 PATCH 语义:字段缺失=不修改,null=清空,空串=置为空文本。
- 数据库同理:NULL 与空串在 SQL 里是两种状态,查询条件
col = ''不会命中 NULL,别混用。
四、容易翻车的场景
- 把 null 当 0 参与运算:
price + 1遇 null 变 NaN/null 传染整个表达式。 - 遍历时对缺失字段取属性:
obj.address.city直接抛错,用可选链obj.address?.city。 - 缓存序列化把 undefined 字段丢掉、回放时结构变了——对结构有要求用 schema 校验(JSON Schema)。
在线体验
不用装任何环境,直接用本站JSON 格式化校验工具在线操作,数据都在浏览器本地处理,方便又安全。
常见问题
null 和 undefined 哪个该出现在 JSON 里?
JSON 标准只有 null,undefined 是 JS 概念且序列化时字段会被丢弃。所以接口里的「空值」统一用 null,别指望传 undefined。
SQL 里 NULL = NULL 为什么是假?
SQL 的 NULL 表示「未知」,两个未知无法比较相等,结果也是未知(非真)。判断要用 IS NULL / IS NOT NULL。
接口字段该可空还是可省略?
列表筛选、部分更新场景:可省略=不动,null=清空。固定结构的数据(配置、详情)倾向字段齐全+null 表空。核心是写进文档、前后端一致。
