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 objets 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 uniquement certains objets, étant donné la valeur d'une sous-clé (ici "location" : "Stockholm"
).
Après avoir trouvé beaucoup de choses sur jQuery sur Google, j'ai trouvé un article de blog avec la réponse:
$ jq '.[] | select(.location=="Stockholm")' json
{
"location": "Stockholm",
"name": "Walt"
}
{
"location": "Stockholm",
"name": "Donald"
}
À partir d'ici: http://zerokspot.com/weblog/2013/07/18/processing-json-with-jq/
Pour obtenir un flux de seulement les noms:
$ jq '.[] | select(.location=="Stockholm") | .name' json
produit:
"Donald"
"Walt"
Pour obtenir un flux de paires correspondantes (nom de clé, attribut "name"), tenez compte des points suivants:
$ jq -c 'to_entries[]
| select (.value.location == "Stockholm")
| [.key, .value.name]' json
Sortie:
["FOO","Donald"]
["BAR","Walt"]
J'avais une question connexe similaire: que se passe-t-il si vous souhaitez récupérer le format d'objet d'origine (avec les noms de clé, par exemple FOO, BAR)?
Jq fournit to_entries
et from_entries
pour convertir des objets et des tableaux de paires clé-valeur. Cela avec map
autour de la sélection
Ces fonctions effectuent la conversion entre un objet et un tableau de paires clé-valeur. Si un objet est transmis à to_entries, le tableau de sortie comprend pour chaque entrée k: v dans l'entrée: {"key": k, "value": v}.
from_entries effectue la conversion opposée, et with_entries (foo) est un raccourci pour to_entries | carte (foo) | from_entries, utile pour effectuer certaines opérations sur toutes les clés et valeurs d'un objet. from_entries accepte les clés, clé, nom, nom, valeur et valeur.
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_entries
, cela devient:
jq15 < json 'with_entries(select(.value.location=="Stockholm"))'
{
"FOO": {
"name": "Donald",
"location": "Stockholm"
},
"BAR": {
"name": "Walt",
"location": "Stockholm"
}
}