jmespath:如何搜索字典结构的字典
jmespath: how to search a dict of dict structure
教程中有一个搜索示例:
{
"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
如何执行此搜索?
您可以使用 *
wildcard expression 来 select 来自散列的所有值:
>>> jmespath.search("machines.*", q)
[{'name': 'a', 'state': 'running'}, {'name': 'b', 'state': 'stopped'}, {'name': 'c', 'state': 'running'}]
现在你有了和以前一样的结构,所以你可以添加[?state=='running'].name
。请将上面的表达式放在括号中,您希望它应用于通配符的数组输出,而不是 machines
映射中的每个单独值:
(machines.*)[?state=='running'].name
或使用 pipe expression:
machines.* | [?state=='running'].name
两者都给你想要的输出:
>>> jmespath.search("(machines.*)[?state=='running'].name", q)
['a', 'c']
>>> jmespath.search("machines.* | [?state=='running'].name", q)
['a', 'c']
教程中有一个搜索示例:
{
"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
如何执行此搜索?
您可以使用 *
wildcard expression 来 select 来自散列的所有值:
>>> jmespath.search("machines.*", q)
[{'name': 'a', 'state': 'running'}, {'name': 'b', 'state': 'stopped'}, {'name': 'c', 'state': 'running'}]
现在你有了和以前一样的结构,所以你可以添加[?state=='running'].name
。请将上面的表达式放在括号中,您希望它应用于通配符的数组输出,而不是 machines
映射中的每个单独值:
(machines.*)[?state=='running'].name
或使用 pipe expression:
machines.* | [?state=='running'].name
两者都给你想要的输出:
>>> jmespath.search("(machines.*)[?state=='running'].name", q)
['a', 'c']
>>> jmespath.search("machines.* | [?state=='running'].name", q)
['a', 'c']