web-dev-qa-db-fra.com

Sélectionner des objets en fonction de la valeur de la variable dans l'objet à l'aide de 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 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").

177
Daniel

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/

256
Daniel

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"]
138
peak

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