jq 1.7中leaf_paths内置函数失效,求替代实现方案
解决jq 1.7中leaf_paths失效的问题
直接替代方案
jq 1.7移除了leaf_paths/0内置函数,改用更灵活的paths(leaf)实现相同功能。把你原有命令里的leaf_paths替换成paths(leaf)即可正常运行。
比如原来的jq 1.6命令:
jq -r 'leaf_paths as $path | {"key": $path | join("."), "value": getpath($path)}' input.json
改成jq 1.7兼容版本:
jq -r 'paths(leaf) as $path | {"key": $path | join("."), "value": getpath($path)}' input.json
跨版本兼容写法
如果需要同时适配jq 1.6和1.7,可以自定义一个leaf_paths函数,放在脚本开头:
def leaf_paths: paths | select(.[-1] | leaf); # 后续写你的扁平化逻辑 leaf_paths as $path | {"key": $path | join("."), "value": getpath($path)}
执行时使用:
jq -f flatten.jq input.json
示例验证
测试JSON(input.json):
{ "user": { "name": "Alice", "contact": { "email": "alice@example.com", "phones": ["123456", "789012"] }, "active": true } }
执行命令后输出:
{"key":"user.name","value":"Alice"} {"key":"user.contact.email","value":"alice@example.com"} {"key":"user.contact.phones.0","value":"123456"} {"key":"user.contact.phones.1","value":"789012"} {"key":"user.active","value":true}
原因说明
jq 1.7对路径相关函数做了重构,paths/1支持传入筛选条件(leaf、array、object等),替代了旧版本中专用的leaf_paths、array_paths等函数,让路径筛选逻辑更统一灵活。
内容的提问来源于stack exchange,提问作者Haim Marko
相关产品推荐
相关产品推荐

