如果级别未知,如何从 json 中提取特定对象类型?

How to extract a particular object type from json if the level is not pre-known?

我有一个 json 如下所示(这只是代表性的):

我面临的问题是 Person 对象在 json 中可以处于不同级别。例如。在下面的例子中,RootNode1 是第 2 级,RootNode2 是第 1 级,RootNode2 是第 0 级。当然,这些级别不限于 2,它们也不以任何方式与 RootNode 相关联。 (并且这些节点值不是预先知道的。唯一固定且唯一以标识 Person 对象的是 "Type": "Person"

在所有情况下我都必须提取 Person 对象。

有没有办法通过遍历 JsonPath 库来实现:https://github.com/json-path/JsonPath?

[
    {
        "RootNode1": [
            {
                "ABC": [
                    {
                        "DEF": ""
                    },
                    {
                        "Name": "John",
                        "Type": "Person"
                        ....
                    }
                ]
            },
            {
                "DAC": {}
            }
        ]
    },
    {
        "RootNode2": [
            {
                "Name": "Williams",
                "Type": "Person"
                ....
            }
        ]
    },
    {
        {
            "Name": "Sam",
            "Type": "Person"
            ....
        }
    }
]

是的,完全有可能。
如果要相信自述文件,他会

JsonPath.read(document, "$.RootNode1.ABC[1].Type");

对于 RootNode1

JsonPath.read(document, "$.RootNode2[1].Type");

对于 RootNode2

JsonPath.read(document, "$.Type");

这是我看到的唯一方法。不过可能还有更简单的,个人习惯用org.json

如果我没理解错的话,就是这个jsonpath表达式

$..Type

应该输出

    [
   "Person",
   "Person",
   "Person"
]

无论 Type 是什么级别。

正确的做法是使用表达式:$..[?(@.Type == 'Person')],例如:

ptx.parse(json).read("$..[?(@.Type == 'Person')]", List.class)
// ptx is ParseContext object of com.jayway.jsonpath

有了这个,我可以获得人员列表,而无需关心 Person 对象存在的级别。