You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现支持嵌套键的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"
}

核心逻辑说明

  1. 拆分嵌套键:将点分隔的嵌套键(如nested.key)用split(".")拆分为路径数组["nested", "key"]
  2. 判断路径存在性:用haspath($path)检查该路径是否在JSON结构中存在(即使对应值为null,只要路径存在就会返回true)
  3. 取值或返回默认值:路径存在时用getpath($path)获取对应值;路径不存在时,将传入的默认值通过fromjson解析为JSON类型后返回(支持字符串、数字、布尔值等类型)

内容的提问来源于stack exchange,提问作者spagh-eddie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:45:36