Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GSON检索嵌套在不断变化的JSON结构/层次结构中的JsonArray_Java_Arrays_Json_Gson - Fatal编程技术网

Java 使用GSON检索嵌套在不断变化的JSON结构/层次结构中的JsonArray

Java 使用GSON检索嵌套在不断变化的JSON结构/层次结构中的JsonArray,java,arrays,json,gson,Java,Arrays,Json,Gson,我想从JSON输出中检索一个数组。数组及其各自的成员永远不会更改。但是,包含数组的JSON输出的层次结构确实会定期更改(超出我的控制范围)。我正在努力找出如何在不知道JSON层次结构的情况下可靠地提取数组 例如: 在JSON输出#1中,我们有一组对象,它们之间嵌套着一个水手数组: { "eat": "grub", "drink": "rum", "sailors": [ { "firstName": "John", "lastName": "Doe"

我想从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输出将来可能会再次更改,我希望我的代码更持久一点,这样我就不必在JSON层次结构再次更改时重新编写或更新它


请帮忙

您可能希望使用递归并手动执行(使用org.json)。您还可以使用或从JSON字符串读取树

您应该有一个
getsealersarray(stringjson)
方法,该方法返回所有sealers的数组

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


输入您的逻辑以检查水手密钥,并在遇到它时返回数组。好了,给你

如果它总是“水手”,您可以递归地搜索该键。