2017-01-10 3 views
6

サブプロパティの値に基づいてオブジェクトのプロパティをjmespathにフィルタリングしようとしていて、サブプロパティが特定の値に設定されているプロパティのみを含める必要があります。この例のデータに基づいてjmespathのキーでオブジェクトをフィルタリングして選択します

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

私は機能が有効になっているすべてのプロパティを持つオブジェクトを取得したいのですが。

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

私はproperty. enabledがtrueに設定されているオブジェクトをフィルタリングするために、このjmespathクエリを使用することができます考え出しました。 Unfortunateley、それは動作していない代わりに空の配列を返します。

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

*.feature.enabledまたは*[feature.enabled]復帰任意のコンテキストなしでちょうどブール値。 *[?feature.enabled==]がうまくいく場合でも

は、それだけでプロパティ値の配列になりますが、私は、キー(ac)aswellを必要としています。これをjmespathで実行する方法はありますか?

これは全て不可能なプレイブックの一部なので、別の方法(Jinja2テンプレートやカスタムプラグイン)で選択を達成する方法は確かにありますが、jmespathを試してみたいと思っていました。そのような仕事。

+0

クエリ以外のものは、ネストされたデータに基づいて特定のキーを削除する必要があります。何か[このPerlの質問](http://stackoverflow.com/q/18660309/2947502)のようなものです。私もあなたがJMESPathでそれを行うことができるかどうかを知りたいと思います。 – techraf

答えて

3

申し訳ありませんが、AFAIKはネイティブJMESPathでは不可能です。
to_entriesjqなどのさまざまなツールで、この目的のためのカスタム組み込み関数があります。
jmespath.pyのために、鍵操作を実装するためにpull requestが吊り下げられています。

更新:私はjson_queryフィルタのパッチを当てました。
詳細については、thisの回答を参照してください。

+0

ありがとう、私はそのプルの要求に従っていると私は一致する辞書項目を選択し、それらを一緒に新しい辞書に置くために、jinja2ループでこの問題を解決しています。 –

+0

PRがマージされるまで[私の問題](/ questions/46306363 /)は解決できませんか?ありがとう! –

関連する問題