标签: jmespath

在 Ansible 中过滤 JSON 文档

我有一个来自 GitHub 存储库的 JSON 回复,其中包含某个版本(assets文档中的数组)的可能下载列表。

我想获得浏览器的下载URL时,name资产端有x64.AppImage

在 Ansible 中,过滤器是基于jmespath它的终端工具构建的,我可以使用以下表达式查询 url:

assets[?ends_with(name, 'x64.AppImage')].browser_download_url
Run Code Online (Sandbox Code Playgroud)

使用以下 playbook,查询 JSON 文档并将其存储在json_reply变量中。

---
- hosts: local
  tasks:
    - name: Get list of Rambox releases
      uri:
        url: "https://api.github.com/repos/saenzramiro/rambox/releases/latest"
        body_format: json
      register: json_reply

    - name: Filter reply
      debug: URL -> "{{ item }}"
      with_items:
        - "{{ json_reply.json | json_query(json_filter) }}"
      vars:
        - json_filter: assets[?ends_with(name, 'x64.AppImage')].browser_download_url
Run Code Online (Sandbox Code Playgroud)

但是,执行此操作会出现以下错误:

fatal: [localhost]: FAILED! => {
    "msg": "JMESPathError in json_query filter …
Run Code Online (Sandbox Code Playgroud)

json ansible jmespath

2
推荐指数
1
解决办法
4157
查看次数

使用jmespath连接json的两个字段

我有这个 inputJson:

[{"firstName": "Kancha", "lastName": "Cheena"},
{"firstName": "Harley", "lastName": "Quinn"}]
Run Code Online (Sandbox Code Playgroud)

预期输出:

[{"fname":"Kancha", "value": "Kancha Cheena"},
{"fname":"Harley", "value": "Harley Quinn"}]
Run Code Online (Sandbox Code Playgroud)

我正在使用这样的表达式:

[*].{fname: firstName, value: firstName lastName}
Run Code Online (Sandbox Code Playgroud)

你能建议更正这个表达吗?

json jmespath

2
推荐指数
1
解决办法
2327
查看次数

逃脱 '。' 在 JMESPath 中

我有一个 JSON 对象,我希望在其中使用 JMESPath 检索名称中包含点的属性的值:

{
  "a": {
    "b.c": "value"
  }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我希望检索value。我怎样才能做到这一点?

jmespath

2
推荐指数
1
解决办法
1222
查看次数

如何在 jmespath 搜索查询的字符串文字键中转义“@”符号

我正在使用 jmespath 搜索一段 JSON,其中一个 JSON 键包含一个“@”符号。由于“@”符号是保留字符,因此 jmespath 会阻塞。我尝试了很多方法来逃避“@”符号,但没有成功。如何在 jmespath 搜索中转义“@”符号?

例子:

json = {"@name": "Bob", "address": "123 Main St"}

jmespath.search("@name", json)
Run Code Online (Sandbox Code Playgroud)

错误信息:

{ParseError} 意外标记:名称:第 1 列解析错误,标记“名称”(UNQUOTED_IDENTIFIER),用于表达式:“@name”^

我还为上述 jmespath 查询尝试了以下变体,但出现了相同的错误:

jmespath.search("!@name", json)
Run Code Online (Sandbox Code Playgroud)
jmespath.search("\@name", json)
Run Code Online (Sandbox Code Playgroud)
jmespath.search("`@`name", json)
Run Code Online (Sandbox Code Playgroud)
jmespath.search("\"@\"name", json)
Run Code Online (Sandbox Code Playgroud)

python-3.x jmespath

2
推荐指数
1
解决办法
796
查看次数

使用 Azure CLI 和 JMESPath 进行筛选

我正在使用 Azure CLI 获取 vnet 对等互连列表:az network vnet peering list. 这将返回以下结构的 json:

[
  {
    ...
    "name": "prefix1-name",
    ...
  },
  {
    ...
    "name": "prefix2-name",
    ...
  }
]
Run Code Online (Sandbox Code Playgroud)

我正在尝试按以某个前缀开头的名称过滤结果。我尝试了以下各种组合: az network vnet peering list --resource-group my-rg --vnet-name my-vnet --query "[?starts_with(name,'prefix1-')].{name}" 但是这总是失败并显示类似].{name} was unexpected at this time.

我错过了什么?

azure-cli jmespath

2
推荐指数
1
解决办法
2198
查看次数

使用字符串过滤 JMESPath

尽管进行了大量研究,我还是找不到解决方案。我被 contains 函数困住了。我有这个 Json 文件:

    {
  "from": "Api",
  "success": true,
  "message": "",
  "errors": [],
  "data": {
    "operations": [
      {
        "IDOperation": 100,
        "DateEcriture": "2019-01-02",
        "Comment": "Invoice Nh5 numero 152",
        "sous_operations": []
      },
      {
        "IDOperation": 101,
        "DateEcriture": "2019-01-02",
        "Comment": "one other thing",
        "sous_operations": []
      },
      {
        "IDOperation":102,
        "DateEcriture": "2019-01-02",
        "Comment": "an other thing",
        "sous_operations": [{"ID-sous-Operation": 103,
                           "DateEcriture": "2019-01-02",
                           "Comment": "Invoice Nh15 numero 341"}]
      }]
   } 
}
Run Code Online (Sandbox Code Playgroud)

我想过滤“注释”字段中包含“发票”一词的对象以获得以下结果:

{"operations": [
      {
        "IDOperation": 100,
        "DateEcriture": "2019-01-02",
        "Comment": "Invoice Nh5 numero 152"
      },
      {
        "IDOperation": …
Run Code Online (Sandbox Code Playgroud)

search json substring contains jmespath

2
推荐指数
1
解决办法
3559
查看次数

如何使用 aws route53 list-resource-record-sets cli

我正在尝试使用 aws route53 cli 命令通过查询列出 zoneId 中的资源记录集

aws route53 list-resource-record-sets \
  --hosted-zone-id $zoneId \
  --query "ResourceRecordSets[?Name == 'abcd.example.com.']"
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误

Bad value for --query "ResourceRecordSets[?Name: Bad jmespath expression: Unclosed " delimiter: "ResourceRecordSets[?Name
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法

Bad value for --query "ResourceRecordSets[?Name: Bad jmespath expression: Unclosed " delimiter: "ResourceRecordSets[?Name
Run Code Online (Sandbox Code Playgroud)
aws route53 list-resource-record-sets \
  --hosted-zone-id $zoneId \
  --query \"ResourceRecordSets[?Name == 'abcd.jazz.t-mobile.com.']\"
Run Code Online (Sandbox Code Playgroud)

但每次我都会遇到同样的错误,我做错了什么吗?另外,我不是在终端中运行它,而是在詹金斯脚本中运行,所以我按照以下方式执行此操作

aws route53 list-resource-record-sets \
  --hosted-zone-id $zoneId \
  --query \"ResourceRecordSets[?Name == \'abcd.jazz.t-mobile.com.\']\"
Run Code Online (Sandbox Code Playgroud)

escaping amazon-route53 aws-cli jmespath

2
推荐指数
1
解决办法
1万
查看次数

在 Ansible json_query 中使用项目

我正在尝试循环遍历键列表以从某些 json 中获取关联名称:

- name: show names
  debug:
    msg: "{{ data.json | json_query(query) }}"
  vars:
    query: "[? key==item].name"
  with_items: "{{ keys.split() }}"
Run Code Online (Sandbox Code Playgroud)

但当我尝试运行它时,它永远不会正确显示。密钥正确,但没有返回数据:

TASK [get_help_on_SO: show] 
ok: [localhost] => (item=Key1) => {
    "msg": []
}
ok: [localhost] => (item=Key2) => {
    "msg": []
}
Run Code Online (Sandbox Code Playgroud)

手动输入代码效果很好,所以我的查询语法似乎是正确的:

query: "[? key==`Key1`].name"

TASK [get_help_on_SO : show] 
ok: [localhost] => (item=Key1) => {
    "msg": [
        "FooBar 1"
]
}
ok: [localhost] => (item=Key2) => {
    "msg": [
        "FooBar 1"
    ]
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能正确地将 传递item到 …

json ansible jmespath

2
推荐指数
1
解决办法
1539
查看次数

如何通过 JMESPath 在 Azure CLI 中查找结果数组的长度?

我正在尝试使用开关--query(例如az functionapp list --query <something>)从 Azure CLI 命令“探索”json 结果,并且首先我想要结果数组的长度。

Azure CLI 帮助没有说明任何具体内容,并指向 jmespath.org,它确实表明存在长度函数,但它似乎需要一个参数。我没有参数的名称,它是 list 命令返回的根/最外层数组。

从 jmespath.org 看来这length(something)就是我想要的,但我不知道要为“某事”部分添加什么。我在这里放什么?或者我对这一切都错了?

azure azure-cli jmespath

2
推荐指数
1
解决办法
2448
查看次数

模板化字符串时出现错误模板错误:没有名为“json_query”的过滤器

有了这本剧本

---
- name: ReadJsonfile
  hosts: localhost
  tasks:
    
    - name: Display the JSON file content
      shell: "cat config.json"
      register: result

    - name: save the Json data to a Variable as a Fact
      set_fact:
        jsondata: "{{ result.stdout | from_json }}"

    - name: setDomainName
      set_fact:
        domain_name: "{{ jsondata | json_query(jmesquery) }}"
      vars:
        jmesquery: '[].domain[].name'
Run Code Online (Sandbox Code Playgroud)

我的 Linux 服务器上有两个用户:user1user2

python3.8pipansible-coreansible-base&jmespath已安装。

我登录user1 ,上面的剧本运行良好

ansible-playbook test.yml

但是,当我登录并user2运行相同的命令时,我收到以下错误

任务 [setDomainName] ************************************************** ********************************************** …

installation runtime-error ansible jmespath json-query

2
推荐指数
1
解决办法
1万
查看次数