如何用jq查询含缺失free字段的JSON中free为true的节点名称?
解决jq查询含缺失字段JSON的报错问题
问题说明
最初的JSON结构如下:
{ "node1": { "name": "host001", "free": true }, "node2": { "name": "host002", "free": false }, "node3": { "name": "host003", "free": false }, "node4": { "name": "host004", "free": true } }
使用命令 .[],select(.free == true).name 可以正常筛选出free为true的节点名称。
但当JSON中混入不包含free字段的元素(比如新增的id字段):
{ "id": "foo", "node1": { "name": "host001", "free": true }, "node2": { "name": "host002", "free": false }, "node3": { "name": "host003", "free": false }, "node4": { "name": "host004", "free": true } }
原命令会报错:parse error: Invalid numeric literal at line 2, column 4。
解决方案
使用has("free")函数先过滤出包含free字段的元素,再进行条件筛选,修正后的命令如下:
.[] | select(has("free") and .free == true) | .name
原理说明
原命令直接访问.free属性,当元素不存在该字段时,jq会因类型不匹配抛出错误。通过has("free")先判断元素是否包含目标字段,再结合.free == true的条件,就能确保只处理符合结构要求的元素,避免报错的同时得到正确结果。执行修正后的命令,会输出:
"host001" "host004"
内容的提问来源于stack exchange,提问作者Burps
相关产品推荐
相关产品推荐

