How to search through a JSON output for a specific key:value?

609 views
Skip to first unread message

alber...@gmail.com

unread,
Sep 9, 2020, 2:59:24 AM9/9/20
to Ansible Project
Morning all,

have had this question from a co-worker & not managed to work out how do do it. Any help is greatly appreciated as I can see this coming up several times in the future as well.

We have the following response body

{

    "products": [

        {

            "chartName": "action-orchestrator",

            "installTime": 1599482114,

            "modifiedTime": 1599482114,

            "name": "Action Orchestrator",

            "revision": 1,

            "status": {

                "message": "Product is ready",

                "progressPercentage": 100,

                "state": "running"

            },

            "version": [

                "5.2.0"

            ]

        },

        {

            "chartName": "cloudcenter-shared",

            "installTime": 1599483017,

            "modifiedTime": 1599483017,

            "name": "cloudcenter-shared",

            "revision": 1,

            "status": {

                "message": "Product is ready",

                "progressPercentage": 100,

                "state": "running"

            },

            "version": [

                "5.4.0"

            ]

        },

        {

            "chartName": "common-framework",

            "installTime": 1599469174,

            "modifiedTime": 1599469174,

            "name": "Suite Admin",

            "revision": 1,

            "status": {

                "message": "Product is ready",

                "progressPercentage": 100,

                "state": "running"

            },

            "version": [

                "5.2.0"

            ]

        },

        {

            "chartName": "workload-manager",

            "installTime": 1599483064,

            "modifiedTime": 1599483064,

            "name": "Workload Manager",

            "revision": 1,

            "status": {

                "message": "Waiting for product to be ready",

                "progressPercentage": 67,

                "state": "creating"

            },

            "version": [

                "5.4.0"

            ]

        }

    ],

    "status": {

        "message": "Product install success",

        "progressPercentage": 100,

        "state": "running"

    }

}



What we need to do is search through 'products', & check that the 'status.state' is 'running' for a specific 'name', in our case 'Workload Manager' 

I can't work out how to provide the search, with the expected result for the co-wokrer to use with an 'until' module.

The idea is to only execute the next task, when the 'status.state' changes to 'running'.


Hope this makes sense!


Regards

Tom Black

unread,
Sep 9, 2020, 3:14:32 AM9/9/20
to ansible...@googlegroups.com
HI

from programming view, you should decode json string to a data structure (hash), then access to the hash.

my test:

$ cat a.json

{"a":123,"b":456,"c":789}


$ perl -MJSON -le 'open FD,"a.json";$str=<FD>;$hash=JSON->new->decode($str);print $hash->{c}'

789


Thanks.





--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/14ccb917-6782-48c5-9d9d-89dafb336d47n%40googlegroups.com.

alber...@gmail.com

unread,
Sep 9, 2020, 3:24:54 AM9/9/20
to Ansible Project
Tom,

thanks for that reply, but it is way beyond my current experience.

but looking at your reply & what i am looking for it doesn't seem to match.

Under 'products' you can see there are several "groups" using the same keys but potentially different values, with nothing unique that i can use to show the difference between them, other the the values for each key. I want to understand if I can 'sort' through the response body, find the required 'name' & associate the correct 'status.state' to it.

Your example only shows one 'group' with clear associations, my response body has multiple similar keys but different values.

Thanks for the response though, but I can't see how it would help me.

Abhijeet Kasurde

unread,
Sep 9, 2020, 3:38:59 AM9/9/20
to ansible...@googlegroups.com
You can read about
 $.products[?(@.chartName == 'workload-manager')]

You can take this free course - https://kodekloud.com/courses/enrolled/635226 to know more about JSON Path.




--
Thanks,
Abhijeet Kasurde

alber...@gmail.com

unread,
Sep 9, 2020, 3:45:06 AM9/9/20
to Ansible Project
Abhijeet,

thanks for that, it looks interesting, but I would like to try to see if there is a solution with as minimal extra libraries needed. Trying to keep it within the Ansible sphere & use Ansible/Jinja2 filters or regex as much as possible.
It may not be possible, I don't know, but the end customer wants to keep the coding within Ansible as much as possible & not be reliant on addition packages. Not an easy task but I do need to find out.

Stefan Hornburg (Racke)

unread,
Sep 9, 2020, 4:10:46 AM9/9/20
to ansible...@googlegroups.com
On 9/9/20 9:45 AM, alber...@gmail.com wrote:
> Abhijeet,
>
> thanks for that, it looks interesting, but I would like to try to see if there is a solution with as minimal extra
> libraries needed. Trying to keep it within the Ansible sphere & use Ansible/Jinja2 filters or regex as much as possible.
> It may not be possible, I don't know, but the end customer wants to keep the coding within Ansible as much as possible &
> not be reliant on addition packages. Not an easy task but I do need to find out.
>

You can use the json_query filter, which uses the jmespath query language.

I'm sure you can find examples with the search engine of your choice.

Regards
Racke

>
>
> On Wednesday, 9 September 2020 at 08:38:59 UTC+1 Abhijeet Kasurde wrote:
>
> You can read about
>
> * jmespath - https://jmespath.org/
> * Use jsonpath - https://jsonpath.com, you may end up something like this
> <https://groups.google.com/d/msgid/ansible-project/14ccb917-6782-48c5-9d9d-89dafb336d47n%40googlegroups.com?utm_medium=email&utm_source=footer>.
>
> --
> You received this message because you are subscribed to the Google Groups "Ansible Project" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to
> ansible-proje...@googlegroups.com.
>
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/ansible-project/c41801fe-83b3-4f23-9cda-6578c1559321n%40googlegroups.com
> <https://groups.google.com/d/msgid/ansible-project/c41801fe-83b3-4f23-9cda-6578c1559321n%40googlegroups.com?utm_medium=email&utm_source=footer>.
>
>
>
> --
> Thanks,
> Abhijeet Kasurde
>
> --
> You received this message because you are subscribed to the Google Groups "Ansible Project" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to
> ansible-proje...@googlegroups.com <mailto:ansible-proje...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/ansible-project/d54ead7e-e067-4562-a162-c406006eb3cbn%40googlegroups.com
> <https://groups.google.com/d/msgid/ansible-project/d54ead7e-e067-4562-a162-c406006eb3cbn%40googlegroups.com?utm_medium=email&utm_source=footer>.


--
Ecommerce and Linux consulting + Perl and web application programming.
Debian and Sympa administration. Provisioning with Ansible.

signature.asc

Abhijeet Kasurde

unread,
Sep 9, 2020, 4:20:07 AM9/9/20
to ansible...@googlegroups.com
---
- hosts: localhost
tasks:
- set_fact:
my_data: "{{ lookup('file', 'data.json') | from_json }}"

- debug:
msg: "{{ my_data.products | json_query(query) }}"
vars:
query: "[?(@.chartName == 'workload-manager')]"



--
Thanks,
Abhijeet Kasurde
Reply all
Reply to author
Forward
0 new messages