我需要根据第一个对象键合并两个JSON对象
object1 = {
"params" : {
"type": ["type1", "type2"],
"requeststate": []
}
}
object2 = {
"params" : {
"type": ["type2", "type3", "type4"],
"requeststate": ["Original", "Revised" ],
"responsestate": ["Approved" ]
}
}
我需要基于第一个对象键合并两个对象,并且我的输出应如下所示
mergedobject = {
"params" : {
"type": ["type1", "type2", "type3", "type4"],
"requeststate": ["Original", "Revised"]
}
}
我搜索了我的案子,但没有发现太多细节 请让我知道Ansible可能与
我可以用
合并数组 set_fact:
mergedrequeststate: "{{ object1.params.requeststate + object2.params.requeststate }}"
但是我的案例涉及超过15个params对象,因此我无法声明所有param对象。将来它还会增长,如果可能,我需要处理。
如果您需要更多详细信息,请发表评论。 感谢您的支持
答案 0 :(得分:1)
使用combine
过滤器。
- set_fact:
mergedobject: "{{ object1.params | combine (object2.params) }}"
答案 1 :(得分:1)
该需求已被很好地描述,我只想添加您想要合并键并从2个对象中获取unique
值(如果不是这种情况,请注意union
过滤器在下面的PB中)。此外,您的示例变量假设我们要合并objectX.params
下的键。
没有进一步的要求,这是一个PB,它将帮助您前进。第一步是调试,以显示object1.params
拥有的所有键,然后是一个循环以合并两个对象的值,然后是最终打印。
PB:
---
- hosts: localhost
gather_facts: false
vars:
object1:
params:
type:
- type1
- type2
requeststate: []
object2:
params:
type:
- type2
- type3
- type4
requeststate:
- Original
- Revised
responsestate:
- Approved
tasks:
- name: print all the keys in the object1.params variable
debug:
msg: "{{ object1['params'].keys() | list }}"
- name: for each key, merge from the 2 variables
set_fact:
mergedobj: "{{ mergedobj|default({}) | combine({item: object1['params'][item] | union(object2['params'][item]) }) }}"
with_items:
- "{{ object1['params'].keys() | list }}"
- name: print final result
debug:
var: mergedobj
执行结果:
[http_offline@greenhat-29 tests]$ ansible-playbook test.yml
PLAY [localhost] *******************************************************************************************************************************************************************************************************
TASK [print all the keys in the object1.params variable] ***************************************************************************************************************************************************************
ok: [localhost] => {
"msg": [
"type",
"requeststate"
]
}
TASK [for each key, merge from the 2 variables] ************************************************************************************************************************************************************************
ok: [localhost] => (item=type)
ok: [localhost] => (item=requeststate)
TASK [print final result] **********************************************************************************************************************************************************************************************
ok: [localhost] => {
"mergedobj": {
"requeststate": [
"Original",
"Revised"
],
"type": [
"type1",
"type2",
"type3",
"type4"
]
}
}
PLAY RECAP *************************************************************************************************************************************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
[http_offline@greenhat-29 tests]$
希望有帮助