首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jmespath:如何搜索字典结构的字典

jmespath:如何搜索字典结构的字典
EN

Stack Overflow用户
提问于 2020-10-10 20:02:03
回答 1查看 338关注 0票数 0

在教程中有一个搜索的例子:

代码语言:javascript
复制
{
  "machines": [
    {"name": "a", "state": "running"},
    {"name": "b", "state": "stopped"},
    {"name": "b", "state": "running"}
  ]
}
In [68]: jmespath.search("machines[?state=='running'].name",p)
Out[68]: ['a', 'b']

但是,我的结构使用字典而不是列表,例如:

代码语言:javascript
复制
In [64]: q={
    ...:   "machines": {
    ...:     "m1":     {"name": "a", "state": "running"},
    ...:     "m2":     {"name": "b", "state": "stopped"},
    ...:     "m3":     {"name": "c", "state": "running"}
    ...:     }
    ...:     }

我不同的解析尝试都失败了:

代码语言:javascript
复制
In [65]: jmespath.search("machines[?state=='running'].name",q)
# no output
In [66]: jmespath.search("machines.*[?state=='running'].name",q)
Out[66]: []

In [67]: jmespath.search("machines[*][?state=='running'].name",q)
# no output

如何执行此搜索?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-10 20:15:48

您可以使用* wildcard expression从散列中选择所有值:

代码语言:javascript
复制
>>> jmespath.search("machines.*", q)
[{'name': 'a', 'state': 'running'}, {'name': 'b', 'state': 'stopped'}, {'name': 'c', 'state': 'running'}]

现在,您拥有了与以前相同的结构,因此可以向其中添加[?state=='running'].name。一定要将上面的表达式放在括号中,您希望它应用于通配符的数组输出,而不是machines映射中的每个单独的值:

代码语言:javascript
复制
(machines.*)[?state=='running'].name

或者使用pipe expression

代码语言:javascript
复制
machines.* | [?state=='running'].name

两者都会给出所需的输出:

代码语言:javascript
复制
>>> jmespath.search("(machines.*)[?state=='running'].name", q)
['a', 'c']
>>> jmespath.search("machines.* | [?state=='running'].name", q)
['a', 'c']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64293195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档