使用 jsonpath 过滤嵌套的 json 数据,如示例所示
Filter nested json data using jsonpath as in example
我正在使用 jsonpath 进行筛选。
Json(虚拟 json 只是为了解释)源字符串,它基本上是操作系统列表及其程序的详细信息等。在这个例子中,OS id = 1403 是 windows 10 OS 并且具有 2 个功能部件和浏览器。 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'
可以帮助我实现上述查询的Json路径字符串是什么?上面的查询使用了与 JsonPath string 类似的语法,但没有完成这项工作。只是为了说明。
还有一个例子 here 获取给定的电影标题 'Starring' 字段
并希望获得满足此条件的完整 OS json。在这种情况下,一个 OS 数组只包含一个 OS 即 id= 2804
[
{
"id": "2804",
...
}
]
我在实现目标之前卡住了很多。这是我的代码,用于获取所有具有“name=browser”的 OS。我得到了数组,但它只包含 value[] 项。我希望它得到完整的 json。它 returns object IDs- 1357, 2765.
List<Map<String, Object>> expensive = JsonPath.parse(jsonDataSourceString)
.read("$[*].features[*].[?(@.name == 'browser')]");
要获得外部数组,您需要使用像 $[?(...)]
这样的过滤器
对于您当前的用例,我们需要使用嵌套数组过滤器。 JsonPath 中有一个未解决的问题,用于在子级别进行过滤。 (参考here)。
幸运的是,有一个解决方法建议使用 contains
而不是 here。
我们可以使用下面的表达式来过滤:
List<Object> expensive = JsonPath.parse(jsonDataSourceString)
.read("$[?(@.features[?(@.name == 'browser')].value[*].feature[*].value contains 'Chrome')]");
打印以下输出
{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"}]}
我正在使用 jsonpath 进行筛选。
Json(虚拟 json 只是为了解释)源字符串,它基本上是操作系统列表及其程序的详细信息等。在这个例子中,OS id = 1403 是 windows 10 OS 并且具有 2 个功能部件和浏览器。 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'
可以帮助我实现上述查询的Json路径字符串是什么?上面的查询使用了与 JsonPath string 类似的语法,但没有完成这项工作。只是为了说明。
还有一个例子 here 获取给定的电影标题 'Starring' 字段
并希望获得满足此条件的完整 OS json。在这种情况下,一个 OS 数组只包含一个 OS 即 id= 2804
[
{
"id": "2804",
...
}
]
我在实现目标之前卡住了很多。这是我的代码,用于获取所有具有“name=browser”的 OS。我得到了数组,但它只包含 value[] 项。我希望它得到完整的 json。它 returns object IDs- 1357, 2765.
List<Map<String, Object>> expensive = JsonPath.parse(jsonDataSourceString)
.read("$[*].features[*].[?(@.name == 'browser')]");
要获得外部数组,您需要使用像 $[?(...)]
对于您当前的用例,我们需要使用嵌套数组过滤器。 JsonPath 中有一个未解决的问题,用于在子级别进行过滤。 (参考here)。
幸运的是,有一个解决方法建议使用 contains
而不是 here。
我们可以使用下面的表达式来过滤:
List<Object> expensive = JsonPath.parse(jsonDataSourceString)
.read("$[?(@.features[?(@.name == 'browser')].value[*].feature[*].value contains 'Chrome')]");
打印以下输出
{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"}]}