如何使用 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]}