Python jmespath:如何搜索dict结构的dict

Python jmespath:如何搜索dict结构的dict,python,json,dictionary,jmespath,Python,Json,Dictionary,Jmespath,本教程中有一个搜索示例: { "machines": [ {"name": "a", "state": "running"}, {"name": "b", "state": "stopped"}, {"name": "b", "state&q

本教程中有一个搜索示例:

{
  "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']
但是,我的结构使用字典而不是列表,例如:

In [64]: q={
    ...:   "machines": {
    ...:     "m1":     {"name": "a", "state": "running"},
    ...:     "m2":     {"name": "b", "state": "stopped"},
    ...:     "m3":     {"name": "c", "state": "running"}
    ...:     }
    ...:     }
我不同的解析尝试都失败了:

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
如何执行此搜索?

您可以使用从哈希中选择所有值:

>>> jmespath.search("machines.*", q)
[{'name': 'a', 'state': 'running'}, {'name': 'b', 'state': 'stopped'}, {'name': 'c', 'state': 'running'}]
现在,您的结构与以前相同,因此可以向其中添加
[?state=='running'].name
。请将上述表达式放在括号中,您希望它应用于通配符的数组输出,而不是
机器
映射中的每个单独值:

(machines.*)[?state=='running'].name
或使用:

两者都提供了所需的输出:

>>> jmespath.search("(machines.*)[?state=='running'].name", q)
['a', 'c']
>>> jmespath.search("machines.* | [?state=='running'].name", q)
['a', 'c']
>>> jmespath.search("(machines.*)[?state=='running'].name", q)
['a', 'c']
>>> jmespath.search("machines.* | [?state=='running'].name", q)
['a', 'c']