如何实现支持嵌套键的jq版get-or-default函数?
实现支持嵌套键的类jq get函数(类似Python dict.get())
需求说明
需要编写一个bash函数my-jq,实现类似Python中dict.get(key, default)的功能:根据指定键获取JSON中的值,当键不存在时返回预设的默认值。特别要求支持嵌套键(如nested.key这种点分隔的形式),预期行为如下:
% echo '{"nested": {"key": "value", "tricky": null}}' > file.json % my-jq nested.key "default" file.json "value" % my-jq nested.tricky "default" file.json null % my-jq nested.dne "default" file.json "default"
现有问题
当前尝试的代码仅支持一级键,无法处理嵌套键:
function my-jq () { jq --arg key "$1" --arg default "$2" \ 'if has($key) then .[$key] else $default | fromjson end' "$3" }
解决方案
修改函数,通过拆分嵌套键为路径数组,结合jq的haspath和getpath函数实现需求:
function my-jq () { jq --arg key "$1" --arg default "$2" \ ' ($key | split(".")) as $path | if haspath($path) then getpath($path) else $default | fromjson end ' "$3" }
核心逻辑说明
- 拆分嵌套键:将点分隔的嵌套键(如
nested.key)用split(".")拆分为路径数组["nested", "key"] - 判断路径存在性:用
haspath($path)检查该路径是否在JSON结构中存在(即使对应值为null,只要路径存在就会返回true) - 取值或返回默认值:路径存在时用
getpath($path)获取对应值;路径不存在时,将传入的默认值通过fromjson解析为JSON类型后返回(支持字符串、数字、布尔值等类型)
内容的提问来源于stack exchange,提问作者spagh-eddie
相关产品推荐
相关产品推荐

