2016-02-11 13 views
7

क्या नेस्टेड ऑब्जेक्ट को JSON में परिवर्तित करने का तरीका बदलने का कोई आसान तरीका है? मैं बैक एंड से मेल खाने के लिए सिर्फ एक JSON ऑब्जेक्ट बनाने की कोशिश कर रहा हूं। मैं अपने नेटवर्किंग के लिए रेट्रोफिट का उपयोग कर रहा हूं, जो जीसन के साथ ऑब्जेक्ट से JSON को परिवर्तित करता है।जीसन - गुणों के रूप में नेस्टेड ऑब्जेक्ट को क्रमबद्ध करें

मुझे नेटवर्क कॉल और कनवर्टन के बीच किसी भी कोड तक पहुंच नहीं है, इसलिए मैं ऑब्जेक्ट को परिवर्तित करने के तरीके को संशोधित करने का एक साफ तरीका खोजने की कोशिश कर रहा हूं, या तो GsonBuilder, या एनोटेशन के माध्यम से।

// Automatically converted to JSON with passed in Gson. 
Call<myObject> search(@Body foo myFoo); 

public class foo { 
    String text = "boo"; 
    bar b = new bar(); 
} 

public class bar { 
    String other = "moo"; 
} 

परिणाम:

{ "text": "boo", "b" { "other": "moo" } } 

वांछित परिणाम:

{ "text": "boo", "other": "moo" } 

आपकी मदद के लिए धन्यवाद। :)

+0

आप जेएसओएन के लिए स्ट्रिंग अन्य के साथ रूपांतरण से डमी क्लास को परिभाषित करने के लिए परिभाषित कर सकते हैं; स्ट्रिंग टेक्स्ट; और इसके लिए गेटर्स सेटर्स। @Awestruck – pratikpawar

उत्तर

4

अद्यतन मैंने जीसनबिल्डर में देखा और हाँ आप इसे कस्टम क्रमबद्धता के साथ कर सकते हैं। आपको serializeJsonSerializer<type>

की विधि को ओवरराइड करने की आवश्यकता है, बस नीचे दी गई कक्षा को परिभाषित करें। यहां केवल 2 गुण जोड़े गए हैं।

public class FooSerialize implements JsonSerializer<foo> { 

@Override 
    public JsonElement serialize(foo obj, Type foo, JsonSerializationContext context) { 

     JsonObject object = new JsonObject(); 
     String otherValue = obj.b.other; 
     object.addProperty("other", otherValue); 
     object.addProperty("text", obj.text); 
     return object; 
    } 
    } 

gson ऑब्जेक्ट नीचे बनाएं।

Gson gson = new GsonBuilder().registerTypeAdapter(foo.class, new FooSerialize()).setPrettyPrinting().create(); 

बस Json

gson.toJson(fooObject); 

देखा में बदलने का! एलएमके अगर यह आपके लिए काम करता है। मैंने अपने सिस्टम पर परीक्षण किया यह काम किया। स्ट्रिंग ओवरराइड करने के बारे में भूल जाओ इसे जेसन से ओबज रूपांतरण के लिए बुलाया जाता है। यह केवल क्रमिकरण है जिसे आपको ऑब्जेक्ट करने के लिए deserialize को संभालने की आवश्यकता है। समान लाइन पर एक विचार प्राप्त करने के लिए ऑनलाइन संसाधनों की तलाश करें।

वैकल्पिक समाधान केवल JSON रूपांतरण उद्देश्यों के लिए डमी pojos परिभाषित किया जाएगा। Pojo ऑब्जेक्ट को मान असाइन करने के लिए उपयोग सेटर्स भेजते समय और जीओएस का उपयोग पोजो के विपरीत या ऊपर के समाधान पर कस्टम धारावाहिक और इच्छित वर्ग के लिए deserialize करने के लिए।

+0

मैं एक और सामान्य समाधान की तलाश में था, क्योंकि मेरी बार श्रेणी में कुछ चर शामिल हैं, और मैं सभी नामों में हार्ड कोड नहीं चाहता हूं। और मैं रेट्रोफिट का उपयोग कर रहा हूं, इसलिए यह ऑब्जेक्ट को कन्वर्ट करने के लिए सिर्फ जीसन का उपयोग कर रहा है, इसलिए मेरे पास कॉल करने के लिए कोई जगह नहीं है।तार(); –

+0

मैंने अभी कोशिश की, और ToString() कभी नहीं कहा गया था। आपके उदाहरण में, यह मान्य JSON जैसा नहीं दिखता है। क्या यह कुछ अलग है? –

+0

अद्यतन के लिए धन्यवाद, अच्छी तरह से काम करता है! मैंने इसे थोड़ा सा संशोधित किया और अपना कोड मेरे उत्तर के रूप में पोस्ट किया। –

1

जो कुछ मैं पूरा करने की कोशिश कर रहा था, उसके बारे में थोड़ा और विवरण जोड़ने के लिए, मुझे जो कुछ लिखा है, उसे दिखाएं, क्योंकि यह किसी और की मदद कर सकता है जो एक ही काम करने की कोशिश कर रहा है। जबकि मेरे मूल ऑब्जेक्ट (foo) में केवल कुछ चर हैं, मेरे बच्चे ऑब्जेक्ट (बार) में संभावित चर की एक लंबी सूची है।

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

उम्मीद है कि यह किसी की मदद करेगा।

public class FooSerializer implements JsonSerializer<Foo> { 
    @Override 
    public JsonElement serialize(Foo src, Type typeOfSrc, JsonSerializationContext context) { 
     JsonObject object = new JsonObject(); 

     object.addProperty("text", src.text); 

     bar myBar = src.getBar(); 

     // Using the context to create a JsonElement from the child Object. 
     JsonElement serialize = context.serialize(myBar, bar.class); 
     JsonObject asJsonObject = serialize.getAsJsonObject(); 

     // Getting a Set of all it's entries. 
     Set<Map.Entry<String, JsonElement>> entries = asJsonObject.entrySet(); 

     // Adding all the entries to the parent Object. 
     for (Map.Entry<String, JsonElement> entry : entries) { 
      object.addProperty(entry.getKey(), entry.getValue().toString()); 
     }  

     return object; 
    } 
} 
संबंधित मुद्दे