J’ai le fichier json suivant:
{ "FOO": { "name": "Donald", "location": "Stockholm" }, "BAR": { "name": "Walt", "location": "Stockholm" }, "BAZ": { "name": "Jack", "location": "Whereever" } }
J’utilise jq et je veux obtenir les éléments “name” des objects où “location” est “Stockholm”.
Je sais que je peux obtenir tous les noms par
cat json | jq .[] | jq ."name" "Jack" "Walt" "Donald"
Mais je ne peux pas comprendre comment imprimer seulement certains objects, étant donné la valeur d’une sous-clé (ici "location" : "Stockholm"
).
Après avoir trouvé des trucs sur Google, j’ai trouvé un article avec la réponse:
$ jq '.[] | select(.location=="Stockholm")' json { "location": "Stockholm", "name": "Walt" } { "location": "Stockholm", "name": "Donald" }
De là: http://zerokspot.com/weblog/2013/07/18/processing-json-with-jq/
Pour obtenir uniquement un stream de noms:
$ jq '.[] | select(.location=="Stockholm") | .name' json
produit:
"Donald" "Walt"
Pour obtenir un stream de paires correspondantes (nom de clé, atsortingbut “name”), considérez:
$ jq -c 'to_ensortinges[] | select (.value.location == "Stockholm") | [.key, .value.name]' json
Sortie:
["FOO","Donald"] ["BAR","Walt"]
J’avais une question similaire: que se passera-t-il si vous souhaitez retrouver le format d’object d’origine (avec des noms de clés, par exemple FOO, BAR)?
Jq fournit to_ensortinges
et from_ensortinges
pour convertir entre les objects et les tableaux de paires clé-valeur. Cela avec la map
autour de la sélection
Ces fonctions convertissent entre un object et un tableau de paires clé-valeur. Si un object est passé à to_ensortinges, pour chaque entrée k: v de l’entrée, le tableau de sortie inclut {“clé”: k, “valeur”: v}.
from_ensortinges fait la conversion inverse et with_ensortinges (foo) est un raccourci pour to_ensortinges | map (foo) | from_ensortinges, utile pour effectuer certaines opérations sur toutes les clés et valeurs d’un object. from_ensortinges accepte la clé, la clé, le nom, le nom, la valeur et la valeur en tant que clés.
jq15 < json 'to_entries | map(select(.value.location=="Stockholm")) | from_entries' { "FOO": { "name": "Donald", "location": "Stockholm" }, "BAR": { "name": "Walt", "location": "Stockholm" } }
En utilisant le raccourci with_ensortinges
, cela devient:
jq15 < json 'with_entries(select(.value.location=="Stockholm"))' { "FOO": { "name": "Donald", "location": "Stockholm" }, "BAR": { "name": "Walt", "location": "Stockholm" } }