如何用Bash jq读取字段名为数字的JSON文件?
如何用jq访问JSON中数字命名的字段?
你的问题出在Unix Shell的引号解析规则和jq语法的结合上,直接用.datasets."0"或者.datasets.0会触发语法错误,以下是正确的解决方法:
正确的访问方式
方式1:方括号语法(推荐)
用["键名"]的形式包裹数字键,同时给整个jq表达式套上单引号,避免Shell解析干扰:
# 访问datasets下的"0"字段 jq '.datasets["0"]' your_file.json # 嵌套访问更深的数字键,比如datasets["0"]["0"]["0"] jq '.datasets["0"]["0"]["0"]' your_file.json
方式2:转义引号(不推荐,易出错)
如果坚持用.的写法,需要给整个jq表达式套上双引号,并转义内部的双引号:
jq ".datasets.\"0\"" your_file.json
这种方式容易因为Shell环境的差异出现问题,所以优先用方括号写法。
错误原因解析
当你在命令行输入jq .datasets."0"时,Shell会先处理引号,把."0"解析成.0,传给jq的表达式变成了.datasets.0。而jq的语法中,. 后面只能跟合法的标识符(不能以数字开头),所以直接写.0会触发语法错误。
而["0"]是jq中访问任意字符串键的通用写法,不管键名是数字还是特殊字符都能正常工作。
额外技巧:遍历所有数字键
如果需要批量处理datasets下的所有数字键,可以用to_entries把对象转成键值对数组:
jq '.datasets | to_entries[]' your_file.json
输出会类似:
{ "key": "0", "value": { "0": { "0":11, "1":11,"2":10 }, "1": { "0":73, "1":77, "2":87 }, ... } }
内容的提问来源于stack exchange,提问作者SaverioV
相关产品推荐
相关产品推荐

