java - Gson反序列化具有递归依赖的复杂对象

标签 java json deserialization gson recursive-datastructures

我有几个包含彼此递归依赖的类,我使用 Gson GraphAdapterBuilder 将它们序列化为 JSON 格式,并且它运行良好。现在我想将它们反序列化为相同的结构,但不知道如何做。

我举了个例子:

class ClassA{
    public int field;
    public ClassB parent;
    public ClassA(int f, ClassB p){
        field = f;
        parent = p;
    }
}

class ClassB{
    public Vector<ClassA> vector = new Vector<ClassA>();
}

...

ClassB b = new ClassB();        

ClassA a1 = new ClassA(1,b);
ClassA a2 = new ClassA(2,b);
ClassA a3 = new ClassA(3,b);

b.vector.add(a1);
b.vector.add(a2);
b.vector.add(a3);

//Serializing object b

GsonBuilder gsonBuilder = new GsonBuilder();

new GraphAdapterBuilder()
    .addType(ClassA.class)
    .addType(ClassB.class)
    .registerOn(gsonBuilder);

Gson gson = gsonBuilder.create();

String json = gson.toJson(b);

输出给了我我想要的:

{"0x1":{"vector":["0x2","0x3","0x4"]},"0x2":{"field":1,"parent":"0x1"},"0x3":{"field":2,"parent":"0x1"},"0x4":{"field":3,"parent":"0x1"}}

有没有办法将该 json 字符串反序列化回 ClassB 的对象?

最佳答案

好的,我找到了解决方案。这很简单。只需使用具有相同 GraphAdapterBuilder 结构的函数 fromJson 而不是 toJson

    ...
    GsonBuilder gsonBuilder = new GsonBuilder();
    new GraphAdapterBuilder()
            .addType(ClassA.class)
            .addType(ClassB.class)
            .registerOn(gsonBuilder);
    gson = gsonBuilder.create();
    СlassB B = gson.fromJson(json,ClassB.class);

    System.out.println("B " + B.vector);
    for(ClassA classA:B.vector){
        System.out.println(classA.field + "  " + classA.parent);
    }

输出是:

    B [ClassA@10178f2b, ClassA@7ab8584d, ClassA@5cad662c]
    1  ClassB@7c0f023c
    2  ClassB@7c0f023c
    3  ClassB@7c0f023c

关于java - Gson反序列化具有递归依赖的复杂对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19204796/

相关文章:

java - org.o7planning.aboutcompany.MainController 中的字段 dataSource 需要类型为 'javax.sql.DataSource' 的 bean,但无法找到

json - 如何使用 Apache NiFi 在拆分 JSON 后检索属性并在 invokeHttp 处理器中递归使用这些属性?

java - Spring RestTemplate 在尝试反序列化对象的嵌套列表时返回 null 对象

java - 关于类加载的困惑

java - 使用反射运行 jar 时出现参数问题

c# - 如何拥有一个带有 json 动态成员的 WCF DataContract

json - 尝试将类型 'FolderBasedDartSdk' 用作函数

java - 运行 google place api 时出现 JsonParseException : The JsonDeserializer com. google.gson.DefaultTypeAdapters

java - 为什么序列化/反序列化几何类型时 Jackson JSON 映射异常

java - 如何在android webview上显示网页的一部分