如何使用 JMESPath 投影列表列表?
How to project list of lists using JMESPath?
假设我有 json:
[
[0, "a"],
[1, "b"],
[2, "c"]
]
如何创建 JMESPath 投影以获取:
[
{"id": 0, "name": "a"},
{"id": 1, "name": "b"},
{"id": 2, "name": "c"}
]
如果您想使用 JMESPath 将数据转换为字典列表:
result = jmespath.search('[*] | [{"id":[0][0], "name":[0][1]},{"id":[1][0], "name":[1][1]},{"id":[2][0], "name":[2][1]}]', data)
我看到你已经标记了 jinja2,所以很容易为 JMESPath
构建一个自动和通用的模板搜索
search = Template('[*] | ['
'{% for l1 in range(data|length) %}'
'{ "id": [{{ loop.index0 }}][0], "name": [{{ loop.index0 }}][1] }'
'{% if not loop.last %},{% else %}]{% endif %}'
'{% endfor %}').render(data=data)
result = jmespath.search(search, data)
结果:
[{'id': 0, 'name': 'a'}, {'id': 1, 'name': 'b'}, {'id': 2, 'name': 'c'}]
对于纯 JMESPath 解决方案——不依赖任何编程语言或任何模板语言——使用查询:
[*].{id: @[0], name: @[1]}
@
符号代表 current node,因此,在您的情况下,是 JMESPath 当前正在考虑的列表列表之一。
这将产生您预期的输出:
[
{
"id": 0,
"name": "a"
},
{
"id": 1,
"name": "b"
},
{
"id": 2,
"name": "c"
}
]
此外,由于当前节点隐含在投影中,您甚至可以将其缩短为
[*].{id: [0], name: [1]}
假设我有 json:
[
[0, "a"],
[1, "b"],
[2, "c"]
]
如何创建 JMESPath 投影以获取:
[
{"id": 0, "name": "a"},
{"id": 1, "name": "b"},
{"id": 2, "name": "c"}
]
如果您想使用 JMESPath 将数据转换为字典列表:
result = jmespath.search('[*] | [{"id":[0][0], "name":[0][1]},{"id":[1][0], "name":[1][1]},{"id":[2][0], "name":[2][1]}]', data)
我看到你已经标记了 jinja2,所以很容易为 JMESPath
构建一个自动和通用的模板搜索search = Template('[*] | ['
'{% for l1 in range(data|length) %}'
'{ "id": [{{ loop.index0 }}][0], "name": [{{ loop.index0 }}][1] }'
'{% if not loop.last %},{% else %}]{% endif %}'
'{% endfor %}').render(data=data)
result = jmespath.search(search, data)
结果:
[{'id': 0, 'name': 'a'}, {'id': 1, 'name': 'b'}, {'id': 2, 'name': 'c'}]
对于纯 JMESPath 解决方案——不依赖任何编程语言或任何模板语言——使用查询:
[*].{id: @[0], name: @[1]}
@
符号代表 current node,因此,在您的情况下,是 JMESPath 当前正在考虑的列表列表之一。
这将产生您预期的输出:
[
{
"id": 0,
"name": "a"
},
{
"id": 1,
"name": "b"
},
{
"id": 2,
"name": "c"
}
]
此外,由于当前节点隐含在投影中,您甚至可以将其缩短为
[*].{id: [0], name: [1]}