jq 中包含“@”和“-”的转义字段名称?

Abh*_*ogi 3 key special-characters jq

输入 JSON:

{
  "abc": {
    "@def-ghi": "value1",
    "xyz": "value2"
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取 field 的价值@def-ghi

? $?=0 ? echo '{"abc": {"@def-ghi": "value1", "xyz": "value2"}}' | jq '.abc.xyz'
"value2"
? $?=0 ? echo '{"abc": {"@def-ghi": "value1", "xyz": "value2"}}' | jq '.abc.@def-ghi'
jq: error: syntax error, unexpected '-', expecting QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.abc.@def-ghi
jq: 1 compile error
? $?=3 ?
Run Code Online (Sandbox Code Playgroud)

如何正确转义字段名称?

che*_*ner 8

您只需要引用密钥:

$ echo '...' | jq '.abc."@def-ghi"'
"value1"
Run Code Online (Sandbox Code Playgroud)


pea*_*eak 6

最可靠的替代方法是使用基本形式:

.[KEY]
Run Code Online (Sandbox Code Playgroud)

其中 KEY 是 JSON 字符串,包括外部引号。

但是,这种形式必须是管道化的,因此您必须编写:

jq '.abc|.["@def-ghi"]'
Run Code Online (Sandbox Code Playgroud)

(该.[_]形式也可用于数组,但当然 _ 必须是整数。)