Reputation: 10256
Given the following JSON I want to get the id
field of the parent by an equals text compare of a sub-child element:
{
"datapoints": [{
"id": "default.1",
"definedBy": "default/0.1",
"featureValues": {
"bui.displayname": "Health status",
"bui.visibility": "normal",
"default.access": "r",
"default.basetype": "text",
"default.description": "Aggregated health status",
"default.format": "text/plain",
"default.name": "health_status",
"default.restriction": "re:(OK|WARN|ERROR|UNKNOWN)"
}
}, {
"id": "kdl.240",
"definedBy": "kdl/0.9",
"featureValues": {
"bui.displayname": "Delta K",
"bui.visibility": "normal",
"default.access": "rw",
"default.basetype": "real",
"default.description": "Delta K",
"default.name": "Delta_K",
"default.privacy": "false",
"default.restriction": "b32"
}
}
]
}
My first goal is to get the correct data point by a sub-child text compare like:
$['datapoints'][*]['featureValues'][?(@['default.name']=='Delta_K')]
It seems not to work when I test it on http://jsonpath.com/ To get all the data points I used this successfully:
$['datapoints'][*]['featureValues']['default.name']
My goal is to get the id
value of the data point with the featureValues
child element default.name
is equal Delta_K
. In the example this would be kdl.240
.
Upvotes: 8
Views: 15466
Reputation: 814
The following code is working for me on https://jsonpath.com :
$.datapoints[?(@.featureValues['default.name']=='Delta_K')].id
Upvotes: 2
Reputation: 9643
You need to find a node containing a featureValues attribute that contains a default.name attribute that matches your text. Using the suggestion at the end of https://github.com/json-path/JsonPath/issues/287 you can get what you want with:
$..[?(@.featureValues[?(@['default.name']=='Delta_K')] empty false)].id
Upvotes: 1
Reputation: 55
#cat jsonData.json | jq ‘.datapoints[].featureValues | select .default.name == 'Delta_K') | .id’
see also: https://github.com/adriank/ObjectPath/issues/70
Upvotes: 0
Reputation: 10256
I could only solve the first part of my question by using:
$['datapoints'][*][?(@['default.name']=='Delta_K')]
During my research I found that jsonpath does not support to get the parent of a filtered node. In Chapter 7 "Conclusion" of http://www.baeldung.com/guide-to-jayway-jsonpath it's written:
Although JsonPath has some drawbacks, such as a lack of operators for reaching parent or sibling nodes, it can be highly useful in a lot of scenarios.
Also further SO posts couldn't help me.
Upvotes: 7