Home > database >  Duplicate object values while merging the JSON Objects arrays in Ansible
Duplicate object values while merging the JSON Objects arrays in Ansible

Time:01-25

I am trying to merge 2 JSON file Objects. But 2 of the objects are getting appended with the same value in both the JSON file.

Here Month & Year values are same in both JSON file like Month=1 & Year=2023, so its getting appended in the output JSON, how can i avoid this? The expected value in the output is Month=1 & Year=2023 and not Month=11 & Year=20232023.

Input1

{
    "data": [
        {
            "item_value_01": "APPLICATION",
            "quantity": 1
        },
        {
            "item_value_01": "HERBERT",
            "quantity": 1
        }
    ],
    "month": "1",
    "year": "2023"
}

Input2

{
    "data": [
        {
            "item_value_01": "Test",
            "quantity": 1
        },
        {
            "item_value_01": "Country",
            "quantity": 1
        }
    ],
    "month": "1",
    "year": "2023"
}

Wrong Output

{
        "data": [
            {
                "item_value_01": "APPLICATION",
                "quantity": 1
            },
            {
                "item_value_01": "HERBERT",
                "quantity": 1
            },
 
            {
                "item_value_01": "Test",
                "quantity": 1
            },
            {
                "item_value_01": "Country",
                "quantity": 1
            }
        ],
        "month": "11",
        "year": "20232023"
    }

Expected Output

{
        "data": [
            {
                "item_value_01": "APPLICATION",
                "quantity": 1
            },
            {
                "item_value_01": "HERBERT",
                "quantity": 1
            },
 
            {
                "item_value_01": "Test",
                "quantity": 1
            },
            {
                "item_value_01": "Country",
                "quantity": 1
            }
        ],
        "month": "1",
        "year": "2023"
    }

Playbook

- set_fact:
        list: "{{ list|default({})| 
                    combine({item: input1[item]|default([])  
                                   input2[item]|default([])}, recursive=true) }}"
     loop: "{{ (input2.keys()|list   input1.keys()|list)|unique }}"

CodePudding user response:

Set list_merge='append' in the filter combine

  result: "{{ [input1, input2]|combine(list_merge='append') }}"

gives the expected result

  result:
    data:
    - item_value_01: APPLICATION
      quantity: 1
    - item_value_01: HERBERT
      quantity: 1
    - item_value_01: Test
      quantity: 1
    - item_value_01: Country
      quantity: 1
    month: '1'
    year: '2023'

Example of a complete playbook for testing

- hosts: localhost

  vars:

    input1:
      data:
      - item_value_01: APPLICATION
        quantity: 1
      - item_value_01: HERBERT
        quantity: 1
      month: '1'
      year: '2023'

    input2:
      data:
      - item_value_01: Test
        quantity: 1
      - item_value_01: Country
        quantity: 1
      month: '1'
      year: '2023'

    result: "{{ [input1, input2]|combine(list_merge='append') }}"

  tasks:

    - debug:
        var: result
  • Related