使用GSON

时间:2015-06-23 17:24:34

标签: java arrays json 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输出可能会在未来再次发生变化,我希望我的代码更耐用,这样我就不必在JSON层次结构再次发生变化时重新编写或更新它。

请帮忙!

1 个答案:

答案 0 :(得分:1)

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

你应该有一个getSailorsArray(String json)方法返回所有水手的数组。

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

输入您的逻辑来检查水手键,并在遇到它时返回数组。你有它!