如何从json中提取一个特定的对象类型,如果级别不是预先知道的?

问题描述 投票:0回答:1

我有一个json,如下图所示(这只是代表)。

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

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

有没有一种方法可以通过JsonPath库中的遍历来实现。https:/github.comjson-pathJsonPath。?

[
    {
        "RootNode1": [
            {
                "ABC": [
                    {
                        "DEF": ""
                    },
                    {
                        "Name": "John",
                        "Type": "Person"
                        ....
                    }
                ]
            },
            {
                "DAC": {}
            }
        ]
    },
    {
        "RootNode2": [
            {
                "Name": "Williams",
                "Type": "Person"
                ....
            }
        ]
    },
    {
        {
            "Name": "Sam",
            "Type": "Person"
            ....
        }
    }
]
java json jsonpath
1个回答
0
投票

是的,这是完全可能的。如果readme是可信的,他使

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

对于RootNode1

还有

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

对于RootNode2

还有

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

但可能还有更简单的,我个人习惯用org.json。


0
投票

如果我没有理解错的话,那么这个jsonpath表达式是这样的

$..Type

应输出

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

无论在哪一级 Type 是。


0
投票

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

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

有了这个,我就可以得到List of persons,而不需要关心Person对象存在的级别。

© www.soinside.com 2019 - 2024. All rights reserved.