2013-10-06 15 views
8

Ho diverse classi che contengono ricorsive l'una a seconda dell'altra e le serializzo in formato JSON con Gson GraphAdapterBuilder e il suo lavoro perfetto. Ora voglio deserializzare nella stessa struttura, ma non riesco a scoprire come.Deserializzare l'oggetto complesso con dipendenze ricorsive.

Faccio alcuni esempi:

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

uscita mi sta dando quello che voglio:

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

C'è un modo per deserializzare quella stringa JSON indietro nel oggetto di ClassB?

risposta

8

Ok, ho trovato la soluzione. È stato molto semplice Dovevo semplicemente usare la funzione daJunon anziché aJson con la stessa struttura 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); 
    } 

uscita è:

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

Questo non è quello che mi serviva affatto. Perché hai sostituito le classi originali in classi con campi di tipo String? Il problema era solo usare le classi con dipendenze ricorsive. La soluzione che hai scritto non è giusta per me. – lub0v

+1

riscrivere le classi originali non è la soluzione ottimale – virsha