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

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

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=;$hash=JSON->new->decode($str);print $hash->{c}’

789

Thanks.

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.

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.

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.

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