2011-01-19 20 views
5

प्ले फ्रेमवर्क में मेरे पास कुछ मॉडल हैं जिनमें फ़ील्ड हैं जो अन्य मॉडलों के ऑब्जेक्ट संदर्भ हैं। जब मैं रेंडरजेसन का उपयोग करता हूं, तो मैं उन ऑब्जेक्ट संदर्भों को शामिल नहीं करना चाहता हूं। वर्तमान में मेरी ज़रूरतों के लिए मैं एक अलग दृश्य मॉडल वर्ग बनाता हूं जिसमें फ़ील्ड मैं चाहता हूं, और नियंत्रक में मैं इस दृश्य वर्ग के उदाहरणों को आवश्यकतानुसार बना देता हूं। आदर्श रूप में मैं व्यू क्लास लिखने के बिना मॉडल क्लास का उपयोग करने में सक्षम होना चाहता हूं।कुछ फ़ील्ड को धारावाहिक होने से रोकें

क्या कोई फ़ील्ड एनोटेट करने का कोई तरीका है ताकि इसे रेंडरजेसन का उपयोग करते समय क्रमबद्ध नहीं किया जा सके?

उत्तर

12

क्योंकि खेलने इसकी Json क्रमबद्धता के लिए Gson का उपयोग करता है आप निम्नलिखित की कोशिश कर सकते हैं:

public static void test() 
{ 
    Object foo = new SomeObject("testData"); 
    Gson gson = new GsonBuilder() 
     .excludeFieldsWithModifiers(Modifier.TRANSIENT) 
     .create(); 
    renderJSON(gson.toJson(foo)); 
} 

अब प्रत्येक क्षेत्र के रूप में चिह्नित क्षणिक धारावाहिक नहीं किया जाएगा। एक और (बेहतर) तरीका भी है। आप प्रत्येक फ़ील्ड को क्रमबद्ध करने के लिए com.google.gson.annotations.Expose एनोटेशन का उपयोग कर सकते हैं।

public static void test() 
{ 
    Object foo = new SomeObject("testData"); 
    Gson gson = new GsonBuilder() 
     .excludeFieldsWithoutExposeAnnotation() 
     .create(); 
    renderJSON(gson.toJson(foo)); 
} 
+0

धन्यवाद देख सकते हैं! एक त्वरित सवाल, आप क्यों कहते हैं कि @Expose का उपयोग करना बेहतर है? –

+0

@ मतिस एलोरियागा मैं व्यक्तिगत रूप से स्पष्ट दृष्टिकोण को बेहतर तरीके से पसंद करता हूं :) यह अक्सर मेरे लिए होता है, कि मैं गलती से खेतों का पर्दाफाश करता हूं। –

-1

मैं serialization बहिष्करण के सदस्य सरणी के खिलाफ फ़ील्ड नाम की जांच करने के लिए renderJSON को ओवरराइड कर दूंगा।

0
नहीं

यकीन है कि क्यों कोई भी यह जवाब देने के लिए सबसे सीधा समाधान लिखा है तो मैं इसे यहाँ क्या करेंगे:

बस उन फ़ील्ड को चिह्नित करें जिन्हें आप जीसन के माध्यम से transient के रूप में क्रमबद्ध नहीं करना चाहते हैं।

यहाँ एक उदाहरण है:

public class Animal 
{ 
     private String name = "dog"; 
     transient private int port = 80; 
     private String species = "canine"; 
     transient private String password = "NoOneShouldSeeThis"; 
} 

आइटम जो क्षणिक चिह्नित कर रहे हैं में से कोई भी धारावाहिक की जाएगी। जब deserialized वे अपने डिफ़ॉल्ट (वर्ग डिफ़ॉल्ट) मान पर सेट किया जाएगा।

परिणामस्वरूप JSON निम्नलिखित तरह दिखेगा:

{"name":"dog","species":"canine"} 

अधिक जानकारी के लिए क्षणिक पर आप इतना Why does Java have transient fields?

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