2016-12-21 6 views
3

json-queryフィルタを使用して、以下のサンプルJSONでTiggerのフードを選択することができますか? JSONは、大規模かつ比較的複雑なAWSブロブの簡略化されたスタンドインです。コンテンツで項目を選択するためのjson-queryパス

背景:私はむしろAnatileがjson-queryフィルタを持っていることを知ってうれしかったです。私がAWS JSON BLOBから要素を選択しようとしていたことを考えると、これは私が必要としていたかのように見えました。 AWSオブジェクトにはタグがあり、タグでアイテムを選択する必要があったため、すぐに問題に遭遇しました。私はFoods[Tags[(Key='For') & (Value='Tigger')]]と同等のセレクタパスを試しましたが、それを動作させることはできませんでした。 https://www.npmjs.com/package/json-queryのようなスタンドアロンのjson-queryライブラリを使用すると、parent属性を使用できますが、json-queryのコアアイデアからの逸脱ではありません。

問題を回避し、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"} 
     ] 
    } 
    ] 
} 

多くの感謝!

参考文献:ansibleで

私はこれをタグ付けするのが大好きですjson-queryを使って質問しますが、そのようにする必要はありません。

+0

期待した結果を指定できますか? – techraf

答えて

6

idsのリストが必要ですか?その場合は、

- 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" 

最初に必要なフィールドを持つ単純なオブジェクトを作成し、フィルタにパイプします。

+0

ありがとう!答えがうまくいかなかった理由を見ると、json_queryフィルタはノードまたはPythonのjsonpathではなくjmespathを使用していることに気付きました。適切な言語リファレンスを使用すると役立ちます!どうもありがとう! –

関連する問題