gpt4 book ai didi

json - JMESPath 从对象的对象生成对象数组

转载 作者:行者123 更新时间:2023-12-04 12:40:46 24 4
gpt4 key购买 nike

我有以下示例 json 文档(对象的对象):

{
"key1": { "key1a": [{"key1aa": "value1aa"}, {"key1ab": "value1ab"}],... },
"key2": { "key2a": [{"key2aa": "value2aa"}, {"key2ab": "value2ab"}],... },
...
}

然后我尝试将它 reshape 为像这样的对象数组

[
{ "key1": { "key1a": [{"key1aa": "value1aa"}, {"key1ab": "value1ab"}],... }},
{ "key2": { "key2a": [{"key2aa": "value2aa"}, {"key2ab": "value2ab"}],... }},
...
]

我可以使用 Ansible 的 jinja2 过滤器 json_query 中的 JMESPath

这怎么可能?

谢谢

大卫

最佳答案

给定 my_dict 剧本

  vars:
my_dict:
key1: { "key1a": ["key1aa": "value1aa", "key1ab": "value1ab"]}
key2: { "key2a": ["key2aa": "value2aa", "key2ab": "value2ab"]}
tasks:
- set_fact:
my_list: "{{ my_list|default([]) + [{item.key: item.value}] }}"
loop: "{{ my_dict|dict2items }}"
- debug:
msg: "{{ my_list|to_json }}"

给予

msg: '[{"key2": {"key2a": [{"key2aa": "value2aa"}, {"key2ab": "value2ab"}]}},
{"key1": {"key1a": [{"key1aa": "value1aa"}, {"key1ab": "value1ab"}]}}]'

输出是使用 yaml 回调 (export ANSIBLE_STDOUT_CALLBACK=yaml) 打印的。然后在列表的第一项之后手动拆分输出。


json_query

也可以使用 jmespath 创建列表,即 json_query。例如,下面的任务给出相同的结果

- set_fact:
my_list: "{{ my_dict|
dict2items|
json_query('[].[{key: key, value: value}]')|
map('items2dict')|
list }}"

to_nice_yaml

使用过滤器 to_nice_yaml 打印时更容易看到数据的结构。例如

- debug:
msg: "{{ my_list|to_nice_yaml }}"

给予

  msg: |-
- key2:
key2a:
- key2aa: value2aa
- key2ab: value2ab
- key1:
key1a:
- key1aa: value1aa
- key1ab: value1ab

filter_plugins

也可以使用自定义 Filter plugins .例如插件

$ cat filter_plugins/dict_utils.py

def dict2list(d):
l = []
for i in d:
h = {i:d[i]}
l.append(h)
return l

class FilterModule(object):

def filters(self):
return {
'dict2list': dict2list
}

下面的任务给出了相同的结果

- set_fact:
my_list: "{{ my_dict|dict2list }}"

为了您的方便:

关于json - JMESPath 从对象的对象生成对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59590507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com