web-dev-qa-db-fra.com

jq - Comment imprimer une valeur parente d'un objet alors que je suis déjà profondément dans les enfants de l'objet

Disons que j'ai le JSON suivant, stocké dans ma variable jsonVariable .

{
    "id": 1,
    "details": {
        "username": "jamesbrown",
        "name": "James Brown"
    }
}

J'analyse ce JSON avec jq en utilisant les éléments suivants:

echo $jsonVariable | jq '.details.name | select(.name == "James Brown")'

Cela me donnerait la sortie

James Brown

Mais que se passe-t-il si je souhaite également obtenir l'identifiant de cette personne? Maintenant, je suis conscient que c'est un exemple simple et approximatif - le programme avec lequel je travaille en ce moment a une profondeur de 5 ou 6 niveaux et de nombreuses fonctions différentes de JQ autres que select. J'ai besoin d'un moyen de sélectionner le champ d'un parent alors que j'ai déjà 5 ou 6 couches de profondeur après avoir effectué diverses méthodes de filtrage.

Quelqu'un peut-il aider? Y a-t-il un moyen de "faire l'inverse", de revenir au parent? (Je ne sais pas si j'ai du sens!)

13
Xenidious

Plutôt que d'interroger jusqu'à la valeur que vous testez, interrogez jusqu'à l'objet racine contenant la valeur sur laquelle vous interrogez et les valeurs que vous souhaitez sélectionner.

Vous avez besoin de l'objet contenant à la fois id et name.

$ jq --arg name 'James Brown' 'select(.details.name == $name).id' input.json
1
Jeff Mercado

Donnez un coup de feu: 

echo $jsonVariable | jq '{Name: .details.name, Id: .Id}  | select(.name == "James Brown")'
1
mrtig