5

有谁知道在下面的示例 JSON 中可以使用什么 json-query 过滤器来选择 Tigger 的食物?JSON 是大型且相对复杂的 AWS blob 的简化替代品。

一些背景知识:我很高兴地发现 Ansible 有一个 json-query 过滤器。鉴于我试图从 AWS JSON blob 中选择一个元素,这看起来好像正是我所需要的。但是我很快就遇到了麻烦,因为 AWS 对象有标签,我需要按标签选择项目。

我尝试了等效Foods[Tags[(Key='For') & (Value='Tigger')]]和类似的选择器路径,但没有设法让它工作。使用独立的 json-query 库,例如https://www.npmjs.com/package/json-query我可以使用该parent属性,但这似乎不在 Ansible 中,除了偏离核心思想之外json 查询。

回避这个问题并使用 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"}
      ]
    }
  ]
}

参考

4

1 回答 1

18

Do you need list of ids? If so, try:

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

First construct simple objects with necessary fields and then pipe it to a filter.

于 2016-12-21T12:20:49.203 回答