2013-10-06 47 views
8

我有一个包含递归视对方一个几类和我他们序列化JSON格式GSON GraphAdapterBuilder,其工作完美。现在我想将它们反序列化为相同的结构,但无法找出如何。GSON反序列化复杂的对象递归依赖

我做了一些例子:

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的对象?

回答

8

好的,我找到了解决办法。这很简单。刚刚必须使用来自Json的函数而不是到Json,它们具有相同的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 [[email protected], [email protected], [email protected]] 
    1 [email protected] 
    2 [email protected] 
    3 [email protected] 
-3
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); 

} 
+0

这不是我所需要的。为什么您将原始类替换为字符串类型为String的类?问题只是使用具有递归依赖性的类。你写的解决方案不适合我。 – lub0v

+1

重写原始类不是最佳解决方案 – virsha