web-dev-qa-db-fra.com

jq Filtre sur la valeur du sous-objet

J'ai un fichier json people.json:

{
  "Joe" : {"Job" : "Clown", "Age" : 22},
  "Sally" : {"Job" : "Programmer", "Age" : 32},
  "Anne" : {"Job" : "Clown", "Age" : 29}
}

Je voudrais sélectionner tout le monde qui est un clown. Ma sortie devrait ressembler à ceci:

{
  "Joe" : {"Job" : "Clown", "Age" : 22},
  "Anne" : {"Job" : "Clown", "Age" : 29}
}

J'ai essayé l'opérateur .. comme dans 

cat people.json | jq '. | map(select(.Job == "Clown"))'

Mais cela semble correspondre à Joe et Anne à plusieurs niveaux et produit plus de résultats que je ne le souhaite. Des idées? Merci.

13
user1879313

utilisez with_entries pour convertir vers/à partir d'un format intermédiaire qui représente ces données sous la forme d'un tableau d'objets avec des éléments key et value:

cat people.json | jq 'with_entries(select(.value.Job == "Clown"))'

selon les documents ici: http://stedolan.github.io/jq/manual/

17
Hans Z.

Voici une solution utilisant réduire  

  . as $v
| reduce keys[] as $k (
    {};
    if $v[$k].Job == "Clown" then .[$k] = $v[$k] else . end
  )
2
jq170727