I have JSON data like this:
{
"profiles": {
"auto_scaler": [
{
"auto_scaler_group_name": "myasg0",
"auto_scaler_group_options": {
":availability_zones": ["1a", "1b", "1c"],
":max_size": 1,
":min_size": 1,
":subnets": ["a", "b", "c"],
":tags": [
{":key": "Name", ":value": "app0" },
{":key": "env", ":value": "dev" },
{":key": "role", ":value": "app" },
{":key": "domain", ":value": "example.com" },
{":key": "fonzi_app", ":value": "true"},
{":key": "vpc", ":value": "nonprod"}
]
},
"dns_name": "fonz1"
},
{
"auto_scaler_group_name": "myasg1",
"auto_scaler_group_options": {
":availability_zones": ["1a", "1b", "1c"],
":max_size": 1,
":min_size": 1,
":subnets": ["a", "b", "c"],
":tags": [
{":key": "Name", ":value": "app1" },
{":key": "env", ":value": "dev" },
{":key": "role", ":value": "app" },
{":key": "domain", ":value": "example.com" },
{":key": "bozo_app", ":value": "true"},
{":key": "vpc", ":value": "nonprod"}
]
},
"dns_name": "bozo1"
}
]
}
}
I want to write a jq query to firstly select the Hash element in the Array at .profiles.auto_scaler whose Array of Hashes at .auto_scaler_group_options.tags contains Hashes containing a ":key" key whose value contains "fonzi" and a ":value" key whose value is exactly true and then return the value of the key dns_name.
In the example, the query would simply return "fonz1".
Does anyone know how to do this, if it is possible, using jq?
In brief, yes.
In long:
.profiles.auto_scaler[]
| .dns_name as $name
| .auto_scaler_group_options
| select( any(.[":tags"][];
(.[":key"] | index("fonzi")) and (.[":value"] == "true")) )
| $name
The output of the above is:
"fonz1"
The trick here is to extract the candidate .dns_name before diving more deeply into your "complex nested JSON".
If your jq does not have any, you could (in this particular case) get away without it by replacing the select expression above with:
select( .[":tags"][]
| (.[":key"] | index("fonzi")) and (.[":value"] == "true") )
Be warned, though, that the semantics of the two expressions are slightly different. (Homework exercise: what is the difference?)
If your jq doesn't have any and if you want the semantics of any, then you could easily roll your own, or simply upgrade :-)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With