对JSON对象读取.foo时,字段不存在和字段明确写成null都可能得到null。若导入规则要区分“没有提交”与“主动清空”,应先用has检查键是否存在,再判断它的值。

先看四种输入
本站使用四个自拟对象:没有name字段、name为null、name为空字符串、name为Ada。这四种输入不应该在没有业务约定的情况下提前合并。
printf '%s
' '[{}, {"name":null}, {"name":""}, {"name":"Ada"}]' |
jq 'map({present: has("name"), value: .name})'
[
{"present":false,"value":null},
{"present":true,"value":null},
{"present":true,"value":""},
{"present":true,"value":"Ada"}
]
把存在性判断放在值判断之前
如果只写.name != null,前两种都会被判断为false,原本的结构差异就丢失了。has("name")检查键是否存在,即使对应值为null也会返回true。上面的命令已在本地运行核对。
筛选时明确保留什么
例如只保留确实提交了name字段的对象,可使用map(select(has("name"))),它会保留显式null和空字符串。若还要求非空文字,则再叠加类型与内容检查;不要直接用一个条件同时承担字段存在、类型正确和业务有效三件事。
printf '%s
' '[{}, {"name":null}, {"name":""}, {"name":"Ada"}]' |
jq 'map(select(has("name")))'
使用之前还要确认输入类型
本文约定输入是对象数组。数组上的has接收的是索引,字符串或混合类型输入也不能不经验证就照搬对象规则。在接口变更测试中,可以将上述四种值做固定用例,检查清空、保留旧值和报错行为是否符合产品约定;jq只负责提取与判断,不会替你定义这些行为。
资料来源与继续学习
资料查阅日期:2026年10月14日。示例、阅读练习与操作建议由本站整理。
资料查阅与编辑日期:2026年10月14日。作者:玖柒。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END






