如何解决如何在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_town
和 people_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,那么你必须以两遍结束:
- 使用
keys
和starts_with
/ends_with
函数创建键列表 - 然后执行第二遍以返回上述查询
从 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 举报,一经查实,本站将立刻删除。