以下のサンプルJSONでティガーの食べ物を選択するために使用できるjson-queryフィルターを知っている人はいますか? JSONは、大規模で比較的複雑なAWSBLOBの簡略化された代用です。
いくつかの背景:Ansibleにjson-queryフィルターがあることを発見してかなり嬉しかったです。 AWS JSON BLOBから要素を選択しようとしていたことを考えると、これはまさに必要なものであるかのように見えました。しかし、AWSオブジェクトにはタグがあり、タグでアイテムを選択する必要があったため、すぐに問題が発生しました。
Foods[Tags[(Key='For') & (Value='Tigger')]]
などと同等のセレクターパスを試しましたが、うまく機能しませんでした。 https://www.npmjs.com/package/json-query などのスタンドアロンのjson-queryライブラリを使用するparent
属性を使用できますが、 json-queryのコアアイデアからの逸脱であることは別として、Ansible。
問題を回避し、jsonpathセレクターを使用する方がよい場合があります。 jsonpathはjson-queryに似ており、xpathからの翻訳です。
{ "Foods" :
[ { "Id": 456
, "Tags":
[ {"Key":"For", "Value":"Heffalump"}
, {"Key":"Purpose", "Value":"Food"}
]
}
, { "Id": 678
, "Tags":
[ {"Key":"For", "Value":"Tigger"}
, {"Key":"Purpose", "Value":"Food"}
]
}
, { "Id": 911
, "Tags":
[ {"Key":"For", "Value":"Roo"}
, {"Key":"Purpose", "Value":"Food"}
]
}
]
}
IDのリストが必要ですか?もしそうなら、試してみてください:
- debug: msg="{{ lookup('file','test.json') | from_json | json_query(query) }}"
vars:
query: "Foods[].{id: Id, for: (Tags[?Key=='For'].Value)[0]} | [?for=='Tigger'].id"
最初に必要なフィールドを持つ単純なオブジェクトを作成し、次にそれをフィルターにパイプします。