2017-01-10 1 views
6

J'essaie de filtrer les propriétés d'un objet dans jmespath en fonction de la valeur d'une sous et que vous souhaitez inclure uniquement les propriétés où la sous-propriété est définie sur une valeur spécifique.objet Filtrer par propriété et sélectionnez avec clé dans jmespath

Sur la base de cet exemple données:

{ 
    "a": { 
    "feature": { 
     "enabled": true, 
    } 
    }, 
    "b": { 
    }, 
    "c": { 
    "feature": { 
     "enabled": false 
    } 
    } 
} 

Je voudrais obtenir un objet avec toutes les propriétés où la fonction est activée.

{ 
    "a": { 
    "feature": { 
     "enabled": true, 
    } 
    } 
} 

Je pensais que je pourrais utiliser cette requête jmespath pour filtrer les objets où property. enabled est fixé à true. Malheureusement, cela ne semble pas fonctionner et renvoie à la place un tableau vide.

*[?feature.enabled==`true`] 

*.feature.enabled ou *[feature.enabled] juste retour des valeurs booléennes sans contexte.

Même si *[?feature.enabled== vrai ] fonctionnerait, il serait juste un tableau des valeurs de propriété, mais je besoin des clés (a et c) aswell. Y at-il un moyen de rendre cela possible dans jmespath? Tout cela fait partie d'un playbook ansible, donc il y aurait certainement un moyen de réaliser la sélection d'une manière différente (templates Jinja2 ou custom plugin) mais je voulais essayer jmespath et raisonner, qu'il devrait être capable de une telle tâche.

+0

Plus que n'importe quoi, vous voulez supprimer certaines clés basées sur des données imbriquées. Quelque chose comme [cette question pour Perl] (http://stackoverflow.com/q/18660309/2947502). Moi aussi j'aimerais savoir si vous pouvez le faire avec JMESPath. – techraf

Répondre

3

Désolé, mais je pense que c'est impossible dans JMESPath natif.
Il existe des fonctions intégrées personnalisées à cet effet dans différents outils tels que to_entries dans jq.
Pour jmespath.py et donc pour Ansible il y a pull request suspendu pour implémenter la manipulation des touches. J'ai fait une version corrigée du filtre json_query.
Voir this pour plus d'informations.

+0

Merci, je suis cette demande de tirage et pour l'instant j'ai résolu ce problème avec une boucle jinja2 pour sélectionner les éléments du dictionnaire correspondant et les assembler à un nouveau dict. –

+0

Est-ce que [mon problème] (/ questions/46306363 /) est tout aussi insoluble jusqu'à ce que ce PR soit fusionné? Merci! –