2013-08-28 7 views
26

मुझे आवश्यकता है जहां मुझे जावा ऑब्जेक्ट को जेसन में परिवर्तित करने की आवश्यकता है।जीसन सीरियलइज फ़ील्ड केवल तभी नहीं है जब शून्य न हो या खाली न हो

मैं इसके लिए जीसन का उपयोग कर रहा हूं लेकिन मुझे कनवर्टर की आवश्यकता केवल गैर शून्य या खाली मानों को क्रमबद्ध करने की आवश्यकता नहीं है।

उदाहरण के लिए:

//my java object looks like 
class TestObject{ 
    String test1; 
    String test2; 
    OtherObject otherObject = new OtherObject(); 
} 
अब

मेरी Gson उदाहरण json को यह वस्तु कन्वर्ट करने के लिए लगता है कि

Gson gson = new Gson(); 
TestObject obj = new TestObject(); 
obj.test1 = "test1"; 
obj.test2 = ""; 

String jsonStr = gson.toJson(obj); 
println jsonStr; 

ऊपर प्रिंट में, परिणाम मैं

{"test1":"test1", "test2":"", "otherObject":{}} 

है यहाँ बस परिणाम

होना चाहता था 210
{"test1":"test1"} 

चूंकि test2 खाली है और अन्य ऑब्जेक्ट खाली है, मैं नहीं चाहता कि उन्हें जेसन डेटा पर क्रमबद्ध किया जाए।

बीटीडब्ल्यू, मैं ग्रोवी/ग्रेइल्स का उपयोग कर रहा हूं, इसलिए यदि कोई प्लगइन है तो यह अच्छा होगा, अगर जीएसएस सीरियलाइजेशन क्लास को कस्टमाइज़ करने के लिए कोई सुझाव अच्छा नहीं होगा।

+1

यह कैसे पता चलता है कि 'अन्य ऑब्जेक्ट' खाली है? –

उत्तर

20

अपनी खुद की TypeAdapter

public class MyTypeAdapter extends TypeAdapter<TestObject>() { 

    @Override 
    public void write(JsonWriter out, TestObject value) throws IOException { 
     out.beginObject(); 
     if (!Strings.isNullOrEmpty(value.test1)) { 
      out.name("test1"); 
      out.value(value.test1); 
     } 

     if (!Strings.isNullOrEmpty(value.test2)) { 
      out.name("test2"); 
      out.value(value.test1); 
     } 
     /* similar check for otherObject */   
     out.endObject();  
    } 

    @Override 
    public TestObject read(JsonReader in) throws IOException { 
     // do something similar, but the other way around 
    } 
} 

फिर आप Gson के साथ रजिस्टर कर सकते हैं बनाएँ।

Gson gson = new GsonBuilder().registerTypeAdapter(TestObject.class, new MyTypeAdapter()).create(); 
TestObject obj = new TestObject(); 
obj.test1 = "test1"; 
obj.test2 = ""; 
System.out.println(gson.toJson(obj)); 

पैदा करता

{"test1":"test1"} 

GsonBuilder वर्ग तरीकों में से एक गुच्छा अपनी खुद की क्रमबद्धता/अक्रमांकन रणनीतियों, प्रकार एडाप्टर बनाने के लिए रजिस्टर किया है, और अन्य पैरामीटर निर्धारित किया है।

Strings एक गुवा वर्ग है। यदि आप उस निर्भरता को नहीं चाहते हैं तो क्या आप जांचते हैं।

+1

क्या होगा यदि मेरे पास टेस्टऑब्जेक्ट क्लास पर अन्य अलग-अलग ऑब्जेक्ट्स हों। पूर्व के लिए: आम तौर पर मेरी कक्षा में विभिन्न प्रकार के – zdesam

+0

@zdesam की कई एम्बेडेड ऑब्जेक्ट्स होंगी, आप इस कक्षा में नेस्टेड क्रमबद्धता करते हैं। यह वर्ग पूरी तरह से आपके 'टेस्टऑब्जेक्ट' वर्ग पर निर्भर है, इसलिए यह अपने सभी क्रमिकरण/deserialization करने के लिए सबसे उपयुक्त है। कोई अन्य घटक आपकी इच्छित कस्टम स्थितियों की जांच नहीं कर सकता है। –

+0

प्रत्येक वर्ग को अच्छी तरह से खाली तारों को छोड़ने के साथ, आपका समाधान मैन्युअल रूप से सब कुछ करने के लिए उबलता है। यहां तक ​​कि सभी क्षेत्रों को क्रमबद्ध करने के लिए कोई विशेष हैंडलिंग की आवश्यकता नहीं है। जीसन ने जो कुछ छोड़ा है उससे ज्यादा कुछ नहीं है। – maaartinus

3

ऐसा लगता है कि समस्या जीसन के साथ नहीं है। जीसन सही ढंग से शून्य और खाली स्ट्रिंग के बीच के अंतर का ट्रैक रखता है। क्या आप वाकई उस भेद को मिटाना चाहते हैं? क्या आप निश्चित हैं कि TestObject का उपयोग करने वाले सभी वर्गों परवाह नहीं है?

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

+0

अच्छा बिंदु, लेकिन अक्सर आप '' ''' '' 'null' दोनों का उपयोग नहीं करना चाहते हैं। सैंटर समाधान शायद 'शून्य' से बच रहा है और केवल '' 'का उपयोग कर रहा है। अन्य पुस्तकालय नल के मुकाबले खाली तारों के साथ बेहतर काम कर सकते हैं। * डेटाबेस न्यूल को लागू नहीं कर सकते हैं लेकिन वे "रिक्त नहीं" को लागू नहीं कर सकते हैं। * +++ नल के लिए सामान्यीकरण मेरे लिए एक विकल्प नहीं है क्योंकि मेरी ऑब्जेक्ट अभी भी एक हाइबरनेट सत्र से जुड़ी हुई बिंदु पर हैं। – maaartinus

3

क्या मैं व्यक्तिगत रूप से जवाब का उपयोग कर TypeAdapter में पसंद नहीं है सच है कि आप अपने पूरे वर्ग जो की सुविधा देता है 50 क्षेत्रों का कहना है (जो TypeAdapter में 50 if ब्लॉक का मतलब है) हो सकता है के हर क्षेत्र का वर्णन करने की आवश्यकता है।
मेरा समाधान Reflection पर आधारित है और एक तथ्य Gson डिफ़ॉल्ट रूप से शून्य मान फ़ील्ड क्रमबद्ध नहीं करेगा।
मेरे पास एक विशेष कक्षा है जिसमें दस्तावेज़ के लिए दस्तावेज़ बनाने के लिए एपीआई के लिए डेटा है, जिसे लगभग 50 फ़ील्ड हैं और मैं String फ़ील्ड को सर्वर या मानों के खाली रिक्त स्थान "" भेजना पसंद नहीं करता हूं।इसलिए मैंने एक विशेष विधि बनाई जो मुझे मेरे ऑब्जेक्ट की प्रतिलिपि सभी खाली फ़ील्ड के साथ वापस लाती है। नोट - डिफ़ॉल्ट रूप से मेरे दस्तावेज़ मॉडल में सभी सरणी खाली (शून्य लंबाई) सरणी के रूप में प्रारंभ की जाती हैं और इस प्रकार वे कभी भी शून्य नहीं होती हैं, आपको शायद अपनी लंबाई जांचने से पहले अपने सरणी को शून्य के लिए जांचना चाहिए।

public DocumentModel getSerializableCopy() { 
    Field fields[] = new Field[]{}; 
    try { 
     // returns the array of Field objects representing the public fields 
     fields = DocumentModel.class.getDeclaredFields(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    DocumentModel copy = new DocumentModel(); 
    Object value; 
    for (Field field : fields) { 
     try { 
      value = field.get(this); 
      if (value instanceof String && TextUtils.isEmpty((String) value)) { 
       field.set(copy, null); 
      // note: here array is not being checked for null! 
      else if (value instanceof Object[] && ((Object[]) value).length == 0) { 
       field.set(copy, null); 
      } else 
       field.set(copy, value); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } 
    return copy; 
} 

इस विधि का उपयोग करके मुझे कोई परवाह नहीं है कि इस विधि को लिखा गया था या जो कुछ भी लिखा गया था, मुझे कोई परवाह नहीं है। एकमात्र समस्या शेष - कस्टम प्रकार फ़ील्ड की जांच कर रही है, जो String या सरणी नहीं हैं, लेकिन यह विशेष वर्ग पर निर्भर करता है और अगर/अन्य ब्लॉक में अतिरिक्त कोड किया जाना चाहिए।

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

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