使用jsonpath过滤嵌套的json数据,如示例所示

bqucvtff  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(725)

我正在使用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')]");
4urapxun

4urapxun1#

要获得外部数组,需要使用如下过滤器 $[?(...)] 对于您当前的用例,我们需要使用嵌套数组过滤器。子级过滤器的jsonpath中存在一个未解决的问题(请参阅此处)。
幸运的是,有一个建议使用的解决方法 contains 在这里。
我们可以使用以下表达式进行筛选:

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

相关问题