获取JQJSON解析中的第一个(或第n个)元素

获取JQJSON解析中的第一个(或第n个)元素,json,jq,Json,Jq,我可以在[]内获取json中的第一个元素 $ echo '[{"a":"x", "b":true}, {"a":"XML", "b":false}]' | jq '.[1]' { "a": "XML", "b": false } 但是,如果json已经被反汇编了,例如,在使用“select”过滤条目之后,我如何选择单个条目并避免这里看到的错误呢 $ echo '[{"a":"x", "b":true}, {"a":"x", "b":false},{"a":"XML", "b":fals

我可以在[]内获取json中的第一个元素

$ echo '[{"a":"x", "b":true}, {"a":"XML", "b":false}]' | jq '.[1]'
{
  "a": "XML",
  "b": false
}
但是,如果json已经被反汇编了,例如,在使用“select”过滤条目之后,我如何选择单个条目并避免这里看到的错误呢

$ echo '[{"a":"x", "b":true}, {"a":"x", "b":false},{"a":"XML", "b":false}]' | jq '.[] | select( .a == "x")'
{
  "a": "x",
  "b": true
}
{
  "a": "x",
  "b": false
}
$ echo '[{"a":"x", "b":true}, {"a":"x", "b":false},{"a":"XML", "b":false}]' | jq '.[] | select( .a == "x") | .[1]'
jq: error (at <stdin>:1): Cannot index object with number
使用地图

映射接收过滤器以过滤阵列

此命令

cat raw.json|jq -r -c 'map(select(.a=="x"))'
给出中间结果

[{a:x,b:true},{a:x,b:false}]


[1]取第一个元素

您可以将select的结果包装在一个数组中:

jq '[.[]|select(.a=="x")][0]' your.json
输出:

{
  "a": "x",
  "b": false
}
jq还提供了,所以在这种情况下,过滤器

  ( map(select(.a == "x")) | first  )
, ( map(select(.a == "x")) | last   ) 
, ( map(select(.a == "x")) | nth(1) )
产生

{
  "a": "x",
  "b": true
}
{
  "a": "x",
  "b": false
}
{
  "a": "x",
  "b": false
}
{
  "a": "x",
  "b": true
}
{
  "a": "x",
  "b": false
}
{
  "a": "x",
  "b": false
}
附加的流媒体表单,也可用于此数据

  ( first(.[]  | select(.a == "x")) )   
, ( last(.[]   | select(.a == "x")) )
, ( nth(1; .[] | select(.a == "x")) )
产生

{
  "a": "x",
  "b": true
}
{
  "a": "x",
  "b": false
}
{
  "a": "x",
  "b": false
}
{
  "a": "x",
  "b": true
}
{
  "a": "x",
  "b": false
}
{
  "a": "x",
  "b": false
}

我认为前面所有的答案都没有抓住要点。要从独立对象流中选择单个条目,您真正需要做的就是使用-slurp选项或-s作为缩写形式:

然后您可以直接索引到数组中。例如,要获取索引为1的第二项:

jq --slurp '.[1]'
将此问题与原始问题放在一起,您希望从流中选择该项目:

echo '{"a":"x", "b":true} {"a":"XML", "b":false}' | jq --slurp '.[1]'
这将导致此输出:

{
  "a": "XML",
  "b": false
}

“[1]”实际获取第二个元素。“”。[0]”将为您获取第一个。Javascript的数组是基于零的.neat。我如何也可以执行jq请求来检索条目数?建议使用内置的或可能将。[]减少为$x0+1.