2013-10-06 9 views
8

Ich habe mehrere Klassen, die rekursiv voneinander abhängig und ich serialisieren sie in JSON-Format mit Gson GraphAdapterBuilder, und seine Arbeit perfekt. Jetzt möchte ich sie in dieselbe Struktur deserialisieren, kann aber nicht herausfinden, wie.Gson Deserialize komplexes Objekt mit rekursiven Abhängigkeiten

ich einige Beispiel machen:

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); 

Output mir gibt, was ich will:

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

Gibt es eine Möglichkeit, dass die JSON-String zurück in Objekt der Klasse B deserialisieren?

Antwort

8

Okay, ich habe eine Lösung gefunden. Es war sehr einfach. Ich musste nur die Funktion vonJson anstelle von toJson mit der gleichen GraphAdapterBuilder-Struktur verwenden.

... 
    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); 
    } 

Ausgang ist:

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

Das ist nicht das, was ich überhaupt benötigt. Warum haben Sie die ursprünglichen Klassen in Klassen mit Feldern vom Typ String ersetzt? Das Problem bestand lediglich darin, die Klassen mit rekursiven Abhängigkeiten zu verwenden. Die Lösung, die du geschrieben hast, ist nicht richtig für mich. – lub0v

+1

das Umschreiben der ursprünglichen Klassen ist nicht die optimale Lösung – virsha