web-dev-qa-db-fra.com

jq analyse la valeur

J'ai besoin d'obtenir quelques valeurs d'un fichier json. J'ai besoin d'un tableau (dimmer1, dimmer2)

Quelqu'un a une idée?

{
 "devices": {
    "dimmer1": {
      "protocol": ["kaku_dimmer"],
      "state": "off",
      "dimlevel": 1
    },
    "dimmer2": {
      "protocol": ["kaku_dimmer"],
      "state": "off",
      "dimlevel": 1
    }
}
12
user3467696

EDIT: Après clarification dans les commentaires, pour récupérer les états des appareils dont la clé commence par "dimmer", utilisez

jq '[ .devices | to_entries[] | select(.key | startswith("dimmer")) | .value = .value.state ] | from_entries' filename.json

Production:

{
  "dimmer1": "off",
  "dimmer2": "off"
}

Cela fonctionne comme suit:

  • .devices Sélectionne l'attribut .devices De l'objet JSON
  • to_entries Fait exploser l'objet en un tableau de paires clé-valeur décrivant ses attributs (les périphériques), c'est-à-dire qu'un attribut "foo": "bar" Devient un objet { "key": "foo", "value": "bar" }, Et le l'objet éclaté est développé en un tableau de ces objets (un pour chaque attribut)
  • to_entries[] Décompresse ce tableau, afin de le diriger à travers
  • select(.key | startswith("dimmer")), qui sélectionne les périphériques dont la clé commence par dimmer
  • .value = .value.state Restructure la paire clé-valeur qui décrit le périphérique afin que la valeur soit remplacée par son attribut state
  • [ all that ] Crée un tableau JSON de tout cela, et
  • [ all that ] | from_entries Reconvertit le tableau de paires clé-valeur en objets JSON.

Ancienne réponse (abrégée), désormais obsolète mais peut-être intéressante:

Pour récupérer les clés des attributs de devices dans un tableau:

jq '.devices | keys' filename.json

Pour récupérer les valeurs (également dans un tableau),

jq '[ .devices[] ]' filename.json

Je ne savais pas exactement lequel de ces deux vous vouliez dire.

24
Wintermute