使用 GSON 检索嵌套在变化的 JSON structure/hierarchy 中的 JsonArray

Retrieve a JsonArray that is nested in a changing JSON structure/hierarchy with GSON

我有一种情况想从 JSON 输出中检索一个数组。数组及其各自的成员永远不会改变。但是,包含数组的 JSON 输出的层次结构确实会定期更改(超出我的控制范围)。我正在努力弄清楚如何在不知道 JSON 层次结构的情况下可靠地提取数组。

示例: 在 JSON 输出 #1 中,我们有一堆对象,它们之间嵌套着一个水手数组:

{
"eat": "grub",
"drink": "rum",
"sailors": [
    {
        "firstName": "John",
        "lastName": "Doe"
    },
    {
        "firstName": "Anna",
        "lastName": "Smith"
    },
    {
        "firstName": "Peter",
        "lastName": "Jones"
    }
]
}

在 JSON 输出 #2 中,我们有相同的水手数组,但它位于层次结构的不同部分:

{
"eat": "grub",
"drink": "rum",
"boats": [
    {
        "name": "blackpearl"
    },
    {
        "name": "batavia",
        "crew": [
            {
                "name": "captain"
            },
            {
                "name": "deckswab",
                "anotherObject": {
                    "sailors": [
                        {
                            "firstName": "John",
                            "lastName": "Doe"
                        },
                        {
                            "firstName": "Anna",
                            "lastName": "Smith"
                        },
                        {
                            "firstName": "Peter",
                            "lastName": "Jones"
                        }
                    ]
                }
            }
        ]
    }
]
}

在这两种情况下,我都希望以水手数组的 Gson JsonArray 结束。

JsonParser parser = new JsonParser();
JsonObject root = parser.parse(json).getAsJsonObject();
JsonArray sailors = root.get("sailors").getAsJsonArray();

以上代码适用于 JSON #1 输出。我知道我可以通过将一堆 get 和 getAsJsonObject/Array 方法串在一起来为 JSON 输出 #2 重写它..

但是,我不确定如何调整它,以便无论数组位于层次结构中的哪个位置,它都能始终找到数组,而不必每次都重新编写代码。这对我来说很重要,因为 JSON 输出将来可能会再次改变,我希望我的代码更耐用一点,这样我就不必在 [=30] 时重新编写或更新它=] 层次结构再次发生变化。

请帮忙!

您可能想要使用递归并手动执行此操作(使用 org.json)。您也可以使用 Gson or Jackson 从 JSON 字符串中读取树。

您应该有一个 getSailorsArray(String json) 方法,该方法 return 是一个包含所有水手的数组。

要以递归方式执行此操作,请创建读取 JSONArray、读取 JSONObject 和读取值的方法。每个方法都将接受一个对象作为参数。检查对象的类型是否为 JSONArrayJSONObject 或值并调用适当的递归方法。如果是数组,可以循环调用getJsonObject方法。

输入你的逻辑来检查水手钥匙,当你遇到它时 return 数组。你有它!