jq区分字段缺失与null:has的用法

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

浅色数据表格与结构化信息卡片
浅色主题概念配图,选自本站AI生成图库;非事件现场或产品实测截图。

先看四种输入

本站使用四个自拟对象:没有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
    喜欢就支持一下吧
    点赞0 分享