Search code examples
jsonobjectautomationansiblejson-query

How to extract object from array by json_query?


I have got json from variable like below.

[
{
    "policyName1": {
    "resourceType": "Name1Type",
    "id": "uuid-0000-000-0-1",
    "extraAttr1": 
    [
        {
            "network11": 
            {
                "allowAction": "yes",
                "ipAddresses":
                [
                    "192.168.29.193",
                    "192.168.29.196"
                ],
                "disabled": false,
                "ip_protocol": "IPV4_IPV6"
            }
        }
    ]
    }
},
{
    "policyName2": {
    "resourceType": "name2Type",
    "id": "uuid-0000-000-0-2",
    "extraAttr12": 
    [
        {
            "network12": 
            {
                "allowAction": "yes",
                "ipAddresses":
                [
                    "192.168.29.193",
                    "192.168.29.197"
                ],
                "disabled": false,
                "ip_protocol": "IPV4_IPV6"
            }
        }
    ]
    }
},
{
    "policyName3": {
    "resourceType": "name3Type",
    "id": "uuid-0000-000-0-3",
    "extraAttr2": 
    [
        {
            "network13": 
            {
                "allowAction": "yes",
                "ipAddresses":
                [
                    "192.168.29.191",
                    "192.168.29.195"
                ],
                "disabled": false,
                "ip_protocol": "IPV4_IPV6"
            }
        }
    ]
    }
}

]

As you can see it is a normaln json. I need select (extract) whole object by id. For example, when I put id "uuid-0000-000-0-3" i would like receive object PolicyName3

{
"policyName3": {
"resourceType": "name3Type",
"id": "uuid-0000-000-0-3",
"extraAttr3": 
[
    {
        "netowork13": 
        {
            "allowAction": "yes",
            "ipAddresses":
            [
                "192.168.29.191",
                "192.168.29.195"
            ],
            "disabled": false,
            "ip_protocol": "IPV4_IPV6"
        }
    }
]
}

}

The digit are add automaticly by software and I can not remove them.

Also it is possible to add extra IP address childName.ipAddresses??

Thank you for help


Solution

  • Q: "Select (extract) the whole object by id."

    A: Given the variable policy_list the tasks below

        - set_fact:
            ext1: "{{ policy_list|
                      map('dict2items')|list|flatten|
                      json_query(query)|
                      items2dict }}"
          vars:
            id: "uuid-0000-000-0-3"
            query: "[?value.id == '{{ id }}']"
        - debug:
            var: ext1
    

    give

        "ext1": {
            "policyName3": {
                "extraAttr2": [
                    {
                        "network13": {
                            "allowAction": "yes", 
                            "disabled": false, 
                            "ipAddresses": [
                                "192.168.29.191", 
                                "192.168.29.195"
                            ], 
                            "ip_protocol": "IPV4_IPV6"
                        }
                    }
                ], 
                "id": "uuid-0000-000-0-3", 
                "resourceType": "name3Type"
            }
        }