使用 jq 从 JSON 数组中提取元素

use*_*428 3 json jq

我有以下 JSON 文件inp.json

{
 "x": 0,
 "tx": [
  {
   "id":  "a",
   "t" : "t for a"
  },
  {
    "id": "b",
    "t": "t for b"
  }
 ]
}
Run Code Online (Sandbox Code Playgroud)

我想提取“tx”中第一次出现的键“t”的值。

我试过

jq -r .tx <inp.json | jq -r '[0].t'
Run Code Online (Sandbox Code Playgroud)

但收到错误消息

断言“cb == jq_util_input_next_input_cb”失败:文件“/usr/src/ports/jq/jq-1.6-1.x86_64/src/jq-1.6/src/util.c”,第371行,函数:jq_util_input_get_position

更新:我也尝试过这些变化

... | jq -r '.[0]t'
Run Code Online (Sandbox Code Playgroud)

... | jq -r '.[0].t'
Run Code Online (Sandbox Code Playgroud)

但前者给出了错误消息jq: error: 语法错误,意外的 IDENT,期待 $end,而后者与我最初的尝试相同的错误。

use*_*686 8

-r如果输出将被送入另一个 JSON 解析器,则不应使用该选项;只有管​​道中的最后一个jq 应该使用它 \xe2\x80\x93 否则您将面临将非 JSON 数据输入到第二个 jq 实例的风险。

\n

您的最后一个示例.[0].t似乎是正确的并且适用于 jq 1.6。

\n
$ cat json | jq '.tx' | jq -r '.[0].t'\nt for a\n
Run Code Online (Sandbox Code Playgroud)\n

但这可以简化为单个 jq 调用,首先逐步增量为:

\n
$ cat json | jq -r '.tx | .[0].t'\nt for a\n
Run Code Online (Sandbox Code Playgroud)\n

然后最后到:

\n
$ cat json | jq -r '.tx[0].t'\nt for a\n
Run Code Online (Sandbox Code Playgroud)\n