关于jq表达式'.key["value"]'与'.key.value'写法差异的疑问
关于jq中
.key["value"]和.key.value写法的差异与适用场景 你观察得没错,在键名是合法标识符(不含空格、特殊符号,不以数字开头)的情况下,这两种写法功能完全一致,但前者存在几个不可替代的适用场景,也是它被使用的原因:
- 处理含特殊字符的键名:如果键名包含空格、连字符(
-)、点号(.)或者以数字开头,点语法.key.value会直接失效。比如键名是user-id,.key["user-id"]能正确取值,但.key.user-id会被jq错误解析为.key.user减去id,导致结果异常甚至报错。 - 动态获取键值:当键名需要通过变量或表达式动态生成时,方括号写法是唯一选择。比如通过bash变量传递键名:
这种场景下点语法根本无法实现动态取值。target="value" jq --arg k "$target" '.key[$k]' config.json - 统一代码风格:部分团队会统一采用方括号加引号的写法,不管键名是否符合标识符规则,避免在不同场景下切换写法,降低因疏忽写错的概率。
- 习惯迁移:如果编写脚本的人有JavaScript、Python等语言的经验,可能更习惯方括号的取值方式,或者从其他项目迁移代码时直接保留了原有写法。
举个实际例子,假设你的config.json是这样:
{ "key": { "value": "normal", "user-name": "alice", "2nd-key": "second" } }
尝试用点语法取user-name的值,会得到错误结果,而.key["user-name"]能正确返回alice。
内容的提问来源于stack exchange,提问作者I J
相关产品推荐
相关产品推荐

