微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在jmespath中匹配数组名称本身的正则表达式json元素字符串正则表达式通配符

如何解决如何在jmespath中匹配数组名称本身的正则表达式json元素字符串正则表达式通配符

如何使用 jmespath 中的正则表达式在 json 中搜索数组?

考虑以下 JSON 文档(如果结构不佳,则将其搁置一旁):

{
  "people_in_town": [
    {"letter": "a"},{"letter": "b"},],"people_with_shoes": [
    {"letter": "c"},{"letter": "d"},"people_with_town": [
    {"letter": "e"},{"letter": "f"},}

现在,jmespath 可以轻松地对列表的所有元素进行通配符,这样 people_in_town[*].letter 将返回 [a,b]

但我想使用的通配符是数组名称上的正则表达式,如下所示:

people_*_town.letter

这样它就会返回 people_in_townpeople_with_town内容,以及任何包含 people_ 后跟 <some string> 后跟 _town 的数组。上面的例子当然行不通。

如何使用 jmespath 将 json 文档中的数组与正则表达式匹配?

解决方法

只是涵盖了您从 linked question 添加的用例,而不是真正通用的关键问题中的通配符,这很可能不会有可能。

但如果你确实有什么要查询的东西

key in ['people_in_town','people_with_town']

因此,使用有限数量的已知密钥,您绝对可以执行类似的操作

[@.people_in_town,@.people_with_town][].letter

那会给:

[
  "a","b","e","f"
]

使用纯 JMESPath 方法将面临的主要问题是,您可以对键执行的唯一操作是基于 keys 函数,遗憾的是不可能同时拥有键数组和然后返回该部分以选择这些键。

如果你真的只想求助于 JMESPath,那么你必须以两遍结束:

  1. 使用 keysstarts_with/ends_with 函数创建键列表
  2. 然后执行第二遍以返回上述查询

从 Ansible 的角度来看,这最终得到了这个非常丑陋的剧本:

- hosts: all
  gather_facts: no

  tasks:
    - debug: 
        msg: >-
          {{
              data | json_query(
                "[@." ~ data | json_query(
                  "join(
                    ',@.',keys(@)[?
                      starts_with(@,'people_') 
                      && ends_with(@,'_town')
                    ]
                  )"
                ) ~ "][].letter"
              )
          }}
      vars:
        data:
          people_in_town:
            - letter: a
            - letter: b
          people_with_shoes:
            - letter: c
            - letter: d
          people_with_town:
            - letter: e
            - letter: f

结果

PLAY [all] *******************************************************************************************

TASK [debug] *****************************************************************************************
ok: [localhost] => 
  msg:
  - a
  - b
  - e
  - f

PLAY RECAP *******************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

所以,如果我是你,我会坚持 linked question 的答案中提出的选项,并在这个特定用例中远离 JMESPath。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。