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

如何让jq正确处理包含数字开头键的路径参数?

解决jq处理数字开头键路径的语法错误问题

问题场景

你通过Shell循环将路径传入jq处理,示例代码如下:

# example path: bigFolder.smallFolder.file
for i in ${!paths[@]}; do 
    path="${paths[$i]}"
    # making sure jq recognizes argument as path
    keyPath=".$path"
    result=`echo "$json_content" | jq "$keyPath"`
    ...
done

但当路径包含数字开头的键(如bigFolder.smallFolder.1thing)时,jq抛出语法错误:

jq: error: syntax error, unexpected LITERAL, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:

问题根源

jq的点语法(.bigFolder.smallFolder)仅支持合法标识符:

  • 不能以数字开头
  • 不能包含空格、特殊符号(如-、@等)

数字开头的键属于非法标识符,必须使用["键名"]的方括号引用格式访问。

解决方法

方法一:转换路径为方括号引用格式

将路径按.分割,把每个路径段用["段名"]包裹,生成jq可识别的合法路径:

# 假设json_content是待处理的JSON字符串,paths是路径数组
for path in "${paths[@]}"; do
    # 用awk将路径转换为.[段1][段2][段3]格式
    keyPath=$(echo "$path" | awk -F '.' '{
        output = "."
        for (i=1; i<=NF; i++) {
            output = output "[\"" $i "\"]"
        }
        print output
    }')
    # 执行jq查询
    result=$(echo "$json_content" | jq "$keyPath")
    # 后续处理逻辑
    echo "$result"
done

方法二:使用jq的getpath函数(推荐)

getpath函数支持直接传入路径数组,无需手动拼接路径语法,兼容性更强:

for path in "${paths[@]}"; do
    # 通过--arg传递路径字符串,在jq中分割为数组后调用getpath
    result=$(echo "$json_content" | jq --arg path_str "$path" 'getpath($path_str | split("."))')
    # 后续处理逻辑
    echo "$result"
done

注意事项

  • 原示例中echo "$path" | jq "$keyPath"是错误写法,应传入待处理的JSON内容而非路径字符串
  • 方法二更简洁,且能兼容所有合法键名(包括含特殊字符的键)

内容的提问来源于stack exchange,提问作者lem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:35:30