JSONPath通过子子值获取父元素的id

时间:2017-08-07 08:56:41

标签: json jsonpath

鉴于以下JSON,我希望通过子子元素的等于文本比较来获取父级的id字段:

{
    "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"
            }
        }
    ]
}

我的第一个目标是通过子子文本比较获得正确的数据点,如:

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

我在http://jsonpath.com/上测试时似乎无法正常工作 为了获得我成功使用的所有数据点:

$['datapoints'][*]['featureValues']['default.name']

我的目标是获取数据点的id值,featureValues子元素default.name等于Delta_K。在示例中,这将是kdl.240

2 个答案:

答案 0 :(得分:1)

我只能使用以下方法解决问题的第一部分:

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

在我的研究中,我发现jsonpath不支持获取已过滤节点的父节点。在第7章"结论"撰写的http://www.baeldung.com/guide-to-jayway-jsonpath

  

尽管JsonPath有一些缺点,例如缺少到达 或兄弟节点的运算符,但它在很多场景中都非常有用。

另外SO帖子也无法帮助我。

答案 1 :(得分:0)

#cat jsonData.json | jq ‘.datapoints[].featureValues | select .default.name == 'Delta_K') | .id’

另请参阅: https://github.com/adriank/ObjectPath/issues/70