如何让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
相关产品推荐
相关产品推荐

