使用 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
和读取值的方法。每个方法都将接受一个对象作为参数。检查对象的类型是否为 JSONArray
或 JSONObject
或值并调用适当的递归方法。如果是数组,可以循环调用getJsonObject
方法。
输入你的逻辑来检查水手钥匙,当你遇到它时 return 数组。你有它!
我有一种情况想从 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
和读取值的方法。每个方法都将接受一个对象作为参数。检查对象的类型是否为 JSONArray
或 JSONObject
或值并调用适当的递归方法。如果是数组,可以循环调用getJsonObject
方法。
输入你的逻辑来检查水手钥匙,当你遇到它时 return 数组。你有它!