json - ansible json-query 路径以按内容选择项目

标签 json ansible jmespath json-query

有谁知道在下面的示例 JSON 中可以使用什么 json-query 过滤器来选择跳跳虎的食物? 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-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:
    http://docs.ansible.com/ansible/playbooks_filters.html#json-query-filter
  • json-query 独立节点:https://www.npmjs.com/package/json-query
  • jmespath,ansible 库使用:http://jmespath.org/
  • json-query 独立 python:https://pypi.python.org/pypi/jsonquery/(红鲱鱼)
  • 最佳答案

    你需要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"
    

    首先构造具有必要字段的简单对象,然后将其通过管道传递给过滤器。

    关于json - ansible json-query 路径以按内容选择项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41261680/

    相关文章:

    Ansible : filter elements containing string with JMESPath

    mysql - JSON 数据更新不起作用(MySQL)

    json - 如何在 WSO2 API 管理器中忽略具有无效 json 正文的 API 调用

    ruby - 使用 rbenv ansible 安装 ruby

    ansible - Ansible playbook 通过 HTTP 进行的 Kerberos 身份验证失败

    javascript - 使用 JMESPath 从 JSON 对象中提取嵌套元素值

    python - jmespath:区分未找到的键和具有空值的键

    javascript - Google 可视化 API 示例中的 "Invalid JSON string"

    javascript - 使用 javascript 从实时数据更新 json 数组

    service - 无法在 WSL Ubuntu 20.04.3 LTS(焦点)中使用本地主机上的 Ansible 模块服务启动 Apache2