Search code examples
jsonjsonpath

JSONPath get the id of a parent element by a sub-child value


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.


Solution

  • The following code is working for me on https://jsonpath.com :

    $.datapoints[?(@.featureValues['default.name']=='Delta_K')].id