Gson

2012-03-05 15 views
6

का उपयोग करके ऑब्जेक्ट लोड करें यदि यह मामूली है या संभव नहीं है तो मुझे माफ़ कर दो लेकिन मुझे सोमवार सुबह का क्षण मिल रहा है।Gson

मैं ऐसी विधि बनाना चाहता हूं जो Gson लाइब्रेरी से कुछ सेटिंग्स ऑब्जेक्ट्स लोड करने के लिए कुछ विधियों को लागू करे। असल में, मैं अलग सेटिंग्स का एक समूह वस्तुओं है, लेकिन मैं करने के लिए मैं कुछ ऐसा करना चाहते हैं प्रत्येक वर्ग के लिए लोड विधि ओवरराइड करने के लिए habe नहीं करना चाहती:

public class ConfigLoader { 
    public static void main(final String[] args) { 
     final ConfigurationSettings loadedConfigSettigs = 
      load("testSettings.json", ConfigurationSettings.class); 

     final AlternativeConfigurationSettings alternativeConfigSettigs = 
      load("testSettings2.json", AlternativeConfigurationSettings .class); 
    } 

    public T load(final InputStream inputStream, final Class<T> clazz) { 
     try { 
      if (inputStream != null) { 
       final Gson gson = new Gson(); 
       final BufferedReader reader = 
        new BufferedReader(new InputStreamReader(inputStream)); 
       return gson.fromJson(reader, clazz); 
      } 
     } catch (final Exception e) { 
     } 
     return null; 
    } 
} 

जहाँ मैं InputStream में पारित कर सकते हैं और उस वस्तु का वर्ग जिसे मैं वापस करना चाहता हूं। क्या ऐसा करने का कोई आसान तरीका है (मैं प्रत्येक वर्ग के लिए एक विधि बनाना नहीं चाहता हूं जिसे मैं लोड करने में सक्षम होना चाहता हूं, न ही मैं प्रत्येक वर्ग के लिए एक विशिष्ट लोडर बनाना चाहता हूं)?

+2

क्या समस्या है? केवल एक चीज जो आपके कोड में सही नहीं है ऑब्जेक्ट टाइपिंग है, क्योंकि यह "टाइप करने योग्य" नहीं है। आपको इसके बजाय सीधे टी वापस करना चाहिए। –

+0

उस निरीक्षण को इंगित करने के लिए धन्यवाद। मैंने कोड में संशोधन किया है और यह दिखाने के लिए कुछ और संदर्भ दिया है कि मैं इसका उपयोग कैसे करना चाहूंगा। मैं मूल रूप से एक लोडर रखना चाहता हूं जो प्रत्येक वर्ग के लिए लोडर बनाने के बिना कक्षा को दिए गए किसी ऑब्जेक्ट को लोड करता है (क्योंकि मुझे 'कक्षा ' विधि का उपयोग करना होगा)? –

+0

ठीक है लेकिन यह काम करता है, ठीक है (इस तथ्य के अलावा कि आप इनपुटस्ट्रीम की बजाय स्ट्रिंग पास कर रहे हैं, लेकिन हमें आपका पॉइंट मिलता है)? (या फिर हमें बताएं कि आपको कौन सी समस्या है)। मुझे आप जो करने की कोशिश कर रहे हैं और जिस तरह से आप ऐसा करने के लिए प्रतीत होते हैं उसमें कोई समस्या नहीं दिखती है। तो, आपको क्या अवरुद्ध कर रहा है? –

उत्तर

10

निम्नलिखित कोड काम करता है (जावा 1.5 या इसके बाद के संस्करण की आवश्यकता है):

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import com.google.gson.Gson; 


public class ConfigLoader { 
    public static void main(final String[] args) { 
     final ConfigurationSettings loadedConfigSettigs = load(new FileInputStream(new File("testSettings.json")), 
       ConfigurationSettings.class); 

     final AlternativeConfigurationSettings alternativeConfigSettigs = load(new FileInputStream(new File("testSettings2.json")), 
       AlternativeConfigurationSettings.class); 
    } 

    public static <T> T load(final InputStream inputStream, final Class<T> clazz) { 
     try { 
      if (inputStream != null) { 
       final Gson gson = new Gson(); 
       final BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
       return gson.fromJson(reader, clazz); 
      } 
     } catch (final Exception e) { 
     } 
     return null; 
    } 
} 
+0

धन्यवाद से पहले 'स्थिर ' डालना न भूलें। यह वास्तव में नौकरी के लिए करता है। क्या आप शायद मुझे ' टी' समझा सकते हैं। मुझे पूरा यकीन नहीं है कि यह क्या कर रहा है? –

+0

वैसे पहला हीरा इंगित करता है कि आप एक प्रकार 'टी' का उपयोग करने जा रहे हैं, दूसरा एक आपकी विधि का वास्तविक रिटर्न प्रकार है। आप यह भी घोषित कर सकते हैं कि <टी MyConfigSettings को विस्तारित करता है> और फिर यह MyConfigSettings या इसके उप-वर्गों में से किसी एक प्रकार का उपयोग करने के लिए मजबूर होगा। उदाहरण के लिए आप कई प्रकार की घोषणा भी कर सकते हैं <टी 1, टी 2 सूची > विस्तारित करता है। अधिक जानकारी के लिए जावा में जेनेरिक पर डॉक्टर की तलाश करें –

+0

धन्यवाद। बहुत सूचनाप्रद। –