21

サブプロパティの値に基づいてjmespathのオブジェクトのプロパティをフィルタリングしようとしており、サブプロパティが特定の値に設定されているプロパティのみを含めたいと考えています。

この例のデータに基づいて:

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

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

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

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

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

*.feature.enabledまたは*[feature.enabled]、コンテキストなしでブール値のみを返します。

*[?feature.enabled==trueが機能したとしても]、それは単なるプロパティ値の配列になりますが、キー (aおよびc) も必要です。jmespathでこれを実現する方法はありますか?

これはすべて ansible プレイブックの一部であるため、別の方法 (Jinja2 テンプレートまたはカスタム プラグイン) で選択を実現する方法は確かにありますが、jmespath を試してみたかったので、そのようなタスクが可能であるべきだと考えました。

4

4 に答える 4

8

申し訳ありませんが、これはネイティブの JMESPath では不可能です。jqのようなさまざまなツールには
、この目的のためのカスタム組み込み関数があります。したがって、Ansible の場合、キー操作を実装するためのプル リクエストがハング しますto_entries
jmespath.py

更新: json_queryフィルターのパッチを適用したバージョンを作成しました。
詳細については、この回答を参照してください。

于 2017-01-11T07:20:00.567 に答える