如何使用gson来反序列化嵌套对象并改变键?

swvgeqrz  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(186)

我尝试解析的一个json示例是:

[
    {
        "id": "123",
        "a*": {
            "b*": {
                "prio": {
                    "d*": {
                        "id": "234",
                        "name": "test"
                    },
                    "d1*": {
                        "id": "678",
                        "name": "test1"
                    }
                }
            },
            "b1*": {
                "prio": {
                    "d2*": {
                        "id": "234",
                        "name": "test4"
                    }
                },
                "prio": {
                    "d3*": {
                        "id": "234",
                        "name": "test3"
                    }
                }
            }
        },
        "a1*": {
            "b2*": {
                "prio": {
                    "d5*": {
                        "id": "5435",
                        "name": "test2"
                    },
                    "d6*": {
                        "id": "675435438",
                        "name": "test15"
                    }
                }
            }
        }
    },
    {
        "id": "345",
        "f*": {
            "g*": {
                "prio": {
                    "i*": {
                        "id": "5435",
                        "name": "test2"
                    }
                }
            }
        }
    },
    {
        "id": "342343"
    }
]

出于解释的目的,带星号的那些在不同的json文件中总是有变化的键,实际的json文件可能在键中有星号,也可能没有星号。嵌套量不会比显示的嵌套更深,但有些可以更浅。prio将始终处于相同的深度级别,我需要除了prio之外的所有键名称。
我怎样用gson解析这个json?任何帮助都是感激的。
我想做的是(改名):
x一个一个一个一个x一个一个二个x
firstMap结果是null,我使用gson的原因是因为我已经在同一个包中使用了其他格式更简单的json文件。

u0njafvf

u0njafvf1#

firstMap结果为null。
这是因为你没有任何json元素名“firstMap”。GSON(和大多数JSON解析器)通过将json元素名Map到class字段来工作。如果你没有一致的元素名,那么你需要一个map来表示具有可变元素名的整个对象。
首先,看起来你在顶层有一个对象数组,所以确保你要求GSON解析一个数组对象。类似于:

ItemType[] items = gson.fromJson(inputString, ItemType[].class)

那么什么是“ItemType”-数组中的每一项都有一个“id”,但后面有变量键,所以你不能使用PolicyObject类,你需要一个String到次要项类型的Map:

Map<String, SecondaryType>[] items =
    gson.fromJson(inputString, Map<String, SecondaryType>[].class)

那么什么是“SecondaryType”呢?同样,所有的键都是可变的,所以你需要一个map:

Map<String, Map<String, ThirdType>[] items =
    gson.fromJson(inputString, Map<String, Map<String, ThirdType[].class)

那么什么是“ThirdType”呢?好吧,在这一点上,似乎你知道你将有一个名为"prio"的键,所以你可以定义一个命名良好的类:

public class ThirdType {
    public Prio prio
}

那么什么是“Prio”呢?它似乎又包含了一个变量键列表,所以我们实际上又回到了通用Map:

public class ThirdType {
    public Map<String, FourthType> prio
}

那么什么是“FourthType”呢?它看起来像一个一致的“id”和“name”:

public class FourthType {
    public String id;
    public String name;
}

有了这些定义,我们回到:

Map<String, Map<String, ThirdType>[] items =
    gson.fromJson(inputString, Map<String, Map<String, ThirdType[].class)

你可以用一个类来清理这个问题,这个类是顶级的map:

public class MyObject extends Map<String, Map<String, ThirdType>> { }

然后你可以这样做:

MyObject[] items = gson.fromJson(inputString, MyObject[].class)

免责声明:我不知道这是否真的能编译,但我认为它应该让你走上正确的道路。

相关问题