jq命令报错Cannot index number with string "id",如何修正获预期输出?
修正jq命令解决索引错误并获取预期输出
原执行命令
jq '[paths | select(.[-1] == "id") | {"path": ., "value": getpath(.)}]' <(echo '[{ "id": 1, "child": { "id": 2 } }]')
错误提示
jq: error (at /dev/fd/63:1): Cannot index number with string "id"
预期输出
[{"path": [0,"id"], "value": 1}, {"path": [1,"child","id"], "value": 2}]
问题原因
paths会递归遍历JSON的所有层级路径,当遍历到数值类型的节点(比如示例中的1和2)时,仍会尝试继续向下索引,但数值无法用字符串"id"进行索引,因此触发报错。
修正方案
方案一:仅生成指向标量值的路径
使用paths(scalars)替代paths,它只会生成最终指向标量(数值、字符串等)的路径,避免遍历到数值节点后继续尝试索引:
jq '[paths(scalars) | select(.[-1] == "id") | {"path": ., "value": getpath(.)}]' <(echo '[{ "id": 1, "child": { "id": 2 } }]')
方案二:筛选时验证父节点类型
在筛选路径时,先检查当前路径的父节点是对象类型,确保"id"是对象的键而非尝试索引数值:
jq '[paths | select(.[-1] == "id" and (getpath(.[0:-1]) | type == "object")) | {"path": ., "value": getpath(.)}]' <(echo '[{ "id": 1, "child": { "id": 2 } }]')
内容的提问来源于stack exchange,提问作者fempto
相关产品推荐
相关产品推荐

