web-dev-qa-db-fra.com

obtenir le premier (ou n'th) élément dans une analyse json json

Je peux obtenir le 1er élément d'un json à l'intérieur []

$ echo '[{"a":"x", "b":true}, {"a":"XML", "b":false}]' | jq '.[1]'
{
  "a": "XML",
  "b": false
}

Mais si le json est déjà démonté (par exemple, après avoir filtré les entrées en utilisant 'select'), comment puis-je choisir une seule entrée et éviter l'erreur vue ici?

$ 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
17
Demian Glait

Vous pouvez encapsuler les résultats de select dans un tableau:

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

Sortie:

{
  "a": "x",
  "b": false
}
24
hek2mgl

jq fournit également first/0 , last/0 , nth/1 donc dans ce cas le filtre

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

produit

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

Des formulaires de streaming supplémentaires 'first/1' , 'last/1' et 'nth/2' sont également disponibles, donc avec ces données

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

produit

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

utilisez map

cat raw.json|jq -r -c 'map(select(.a=="x"))|.[1]'

map recivce a filter pour filtrer un tableau.

cette commande

cat raw.json|jq -r -c 'map(select(.a=="x"))'

donner le résultat moyen

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

.[1] prendre le premier élément

1
tink