Reputation: 49
I have below data:
{
"msg": [
{
"country": {
"city": {
"county": [
{
"zipcode": "code1",
"address": "add1"
},
{
"zipcode": "code2",
"address": "add2"
},
{
"zipcode": "code3",
"address": "add3"
}
]
}
},
"countyname": "county-a"
},
{
"country": {
"city": {
"county": {
"zipcode": "code1",
"address": "add1"
}
}
},
"countyname": "county-b"
}
]
}
First attempt:
- name: data
debug: out= "{{msg | json_query(query)}}"
vars:
query: "[].{county: countyname, zipcode: country.city.county[].zipcode , address: country.city.county[].address}"
Result:
[
{
"county": "county-a",
"zipcode": [
"code1",
"code2",
"code3"
],
"address": [
"add1",
"add2",
"add3"
]
},
{
"Name": "county-b",
"local": null,
"remote": null
}
]
Second attempt:
- name: data
debug: out= "{{msg | json_query(query)}}"
vars:
query: "[].{county: countyname, zipcode: country.city.county.zipcode , address: country.city.county.address}"
Result:
[
{
"county": "county-a",
"zipcode": null,
"address": null
},
{
"county": "county-b",
"zipcode": "code1",
"address": "add1"
}
]
If I use query: "[].{County: countyname, zipcode: country.city.county[].zipcode, address: country.city.county[].address}"
, I get null
values for county-b
.
If I use query: "[].{County: countyname, zipcode: country.city.county.zipcode, address: country.city.county.address}"
, I get null
values for county-a
.
What is the right way to use json_query
so that using a single query, I get both county data like
[
{
"county": "county-a",
"zipcode": [
"code1",
"code2",
"code3"
],
"address": [
"add1",
"add2",
"add3"
]
},
{
"Name": "county-b",
"zipcode": "code1",
"address": "add1"
}
]
Upvotes: 1
Views: 1095
Reputation: 39069
You can use an or expression (||
), that will catch null
value and display the second expression when the first one is indeed null
.
So something like:
zipcode: country.city.county.zipcode || country.city.county[].zipcode
So, the whole JMESPath query ends up being:
[].{county: countyname, zipcode: country.city.county.zipcode || country.city.county[].zipcode, address: country.city.county.address || country.city.county[].address}
Given the task:
- debug:
var: msg | json_query(query)
vars:
query: >-
[].{
county: countyname,
zipcode: country.city.county.zipcode || country.city.county[].zipcode,
address: country.city.county.address || country.city.county[].address
}
msg:
- country:
city:
county:
- zipcode: code1
address: add1
- zipcode: code2
address: add2
- zipcode: code3
address: add3
countyname: county-a
- country:
city:
county:
zipcode: code1
address: add1
countyname: county-b
This yields:
{
"msg | json_query(query)": [
{
"address": [
"add1",
"add2",
"add3"
],
"county": "county-a",
"zipcode": [
"code1",
"code2",
"code3"
]
},
{
"address": "add1",
"county": "county-b",
"zipcode": "code1"
}
]
}
Upvotes: 1