使用 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"}]}