使用jq按orgs数组值查询收件人时出现包含检查错误如何解决
问题原因
你遇到的报错是因为 jq 的 contains 函数对输入类型有匹配要求:当左侧操作数是数组时,右侧也必须传入数组(用来判断左侧数组是否完全包含右侧数组的所有元素),你直接传入字符串 "Service A" 就触发了类型不匹配的错误。
解决方案
完全可以用 jq 实现你的需求,推荐两种常用写法:
写法1:用index函数快速判断
index可以直接检查数组中是否存在指定元素,存在就返回对应的下标,不存在返回null,命令如下:
cat /path/to/file.json | jq '.groups[] | select(.orgs | index("Service A") != null) | .recipients[]'
写法2:用any函数做精确匹配(更严谨)
如果要避免index的模糊匹配问题(比如元素包含特殊字符的场景),用any遍历数组判断更稳妥:
cat /path/to/file.json | jq '.groups[] | select(any(.orgs[]; . == "Service A")) | .recipients[]'
执行输出
两种写法执行后都会返回你要的结果:
{ "name": "Jane Bloggs", "email": "jane.bloggs@business.org" }
如果你只需要单独提取邮箱或者姓名,后面再加对应的字段即可,比如要输出邮箱字符串,就改成:
cat /path/to/file.json | jq -r '.groups[] | select(any(.orgs[]; . == "Service A")) | .recipients[].email'
输出就是纯文本的 jane.bloggs@business.org
内容的提问来源于stack exchange,提问作者yungblazeboy
相关产品推荐
相关产品推荐

