2013-10-06 10 views
8

मेरे पास कई कक्षाएं हैं जिनमें एक-दूसरे के आधार पर रिकर्सिव होता है और मैं उन्हें जीएसओएन ग्राफएडप्टरबिल्डर के साथ जेएसओएन प्रारूप में क्रमबद्ध करता हूं, और इसका काम सही है। अब मैं उन्हें एक ही संरचना में deserialize करना चाहता हूं, लेकिन यह पता नहीं लगा सकता कि कैसे।जीसन रिकर्सिव निर्भरताओं के साथ जटिल वस्तु को deserialize

मैं कुछ उदाहरण हैं:

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 स्ट्रिंग वापस deserialize करने के लिए ClassB की वस्तु में कोई तरीका है?

उत्तर

8

ठीक है, मुझे समाधान मिला। यह बहुत आसान था। उसी ग्राफAdapterBuilder संरचना के साथ 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 [[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

यह है कि मैं क्या बिल्कुल जरूरत नहीं है। आपने मूल कक्षाओं को स्ट्रिंग के प्रकार वाले वर्गों के साथ कक्षाओं में क्यों बदल दिया? समस्या सिर्फ रिकर्सिव निर्भरताओं वाले वर्गों का उपयोग करने के लिए थी। आपके द्वारा लिखे गए समाधान मेरे लिए सही नहीं हैं। – lub0v

+1

मूल कक्षाओं को फिर से लिखना इष्टतम समाधान नहीं है – virsha

संबंधित मुद्दे