使用Gson反序列化具有递归依赖关系的复杂对象

10

我有几个类彼此之间存在递归依赖关系,并使用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 对象?


我正在使用Gson依赖项,但不知何故它不包含GraphAdapterBuilder类。你能帮忙吗?那是哪个版本? - Pascoal Eddy Bayonne
2个回答

8

好的,我找到了解决方案。非常简单,只需要使用函数fromJson而不是toJson,并使用相同的GraphAdapterBuilder结构。

    ...
    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

我正在使用Gson依赖项,但不知何故它不包含GraphAdapterBuilder类。你能帮忙吗?那是哪个版本? - Pascoal Eddy Bayonne

-4
class ClassA{
    public int field;
    public String parent;
    public ClassA(int f, String parent){
        this.field = f;
        this.parent = parent;
    }
}

class ClassB{
    public List<String> vector;
}

String str1 = "{\"0x1\":{\"vector\":[\"0x2\",\"0x3\",\"0x4\"]},\"0x2\":{\"field\":1,\"parent\":\"0x1\"},\"0x3\":{\"field\":2,\"parent\":\"0x1\"},\"0x4\":{\"field\":3,\"parent\":\"0x1\"}}";

JsonParser parser = new JsonParser();
JsonObject element = (JsonObject)parser.parse(str1);
JsonElement responseWrapper = element.get("0x1");
Gson gson = new Gson();
ClassB  classB =gson.fromJson(responseWrapper,ClassB.class);
System.out.println(classB.vector);
for (String key:classB.vector) {
      responseWrapper = element.get( key);
      ClassA  classA =gson.fromJson(responseWrapper,ClassA.class);
      System.out.println(classA.field);
      System.out.println(classA.parent);

}

这根本不是我需要的。为什么你把原来的类替换成了带有字符串类型字段的类?问题只是要使用具有递归依赖关系的类。你写的解决方案对我来说不正确。 - lub0v
1
重写原始类并不是最优解决方案。 - virsha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接