我正在使用jsonpath进行过滤。
json(dummy json just to explain)源字符串,它基本上是一个操作系统列表及其程序的详细信息等。在本例中,id=1403的操作系统是一个windows10操作系统,具有两个特性:架构和浏览器。浏览器特性的更多细节如json所示
[
{
"id": 1403,
"os": "window 10",
"features": [
{
"id": 1356,
"name": "architecture",
"value": [
{
"id": 1308,
"feature": [
{
"id": 1262,
"key": "name",
"value": "amd64"
}
]
}
],
"category": "cat1"
},
{
"id": 1357,
"name": "browser",
"value": [
{
"id": 1309,
"feature": [
{
"id": 1263,
"key": "name",
"value": "Firefox"
},
{
"id": 1265,
"key": "version",
"value": "187"
}
]
}
],
"category": "cat2"
}
]
},
{
"id": 2804,
"os": "window 7",
"features": [
{
"id": 2764,
"name": "architecture",
"value": [
{
"id": 2719,
"feature": [
{
"id": 2679,
"key": "name",
"value": "amd64"
}
]
}
],
"category": "cat1"
},
{
"id": 2765,
"name": "browser",
"value": [
{
"id": 2722,
"feature": [
{
"id": 2685,
"key": "name",
"value": "Chrome"
},
{
"id": 2684,
"key": "version",
"value": "87.0.4280.88"
}
]
}
],
"category": "cat2"
}
]
}
]
我希望能够过滤json,以便
features[*].name == 'browser' and features[*].value[*].feature[*].value == 'chrome'
可以帮助我实现上述查询的jsonpath字符串是什么?上面的查询使用了jsonpath string使用的类似语法,但不起作用。只是为了解释。
这里还有另一个例子,在“主演”字段中获得电影标题
并希望获得满足此条件的完整os json。在这种情况下,一个操作系统数组只包含一个操作系统,即id=2804
[
{
"id": "2804",
...
}
]
我在实现什么目标之前就被困住了。下面是我的代码,以获得所有的操作系统有“名称=浏览器”。我得到数组,但它只包含value[]项。我要它得到完整的json。它返回ID为-13572765的对象。
List<Map<String, Object>> expensive = JsonPath.parse(jsonDataSourceString)
.read("$[*].features[*].[?(@.name == 'browser')]");
1条答案
按热度按时间4urapxun1#
要获得外部数组,需要使用如下过滤器
$[?(...)]
对于您当前的用例,我们需要使用嵌套数组过滤器。子级过滤器的jsonpath中存在一个未解决的问题(请参阅此处)。幸运的是,有一个建议使用的解决方法
contains
在这里。我们可以使用以下表达式进行筛选:
打印以下输出