Sélectionner des objects en fonction de la valeur de la variable dans l’object en utilisant jq

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" } }