2011-09-24 16 views
20

मुझे कुछ ऑब्जेक्ट्स के लिए JSON क्रमबद्धता को कार्यान्वित करने की आवश्यकता है, और जेनेरिक संग्रहों के साथ एकीकरण के लिए मुझे एक समस्या आई है।जावा JSON क्रमबद्धता - सर्वोत्तम अभ्यास

सभी serializable वर्गों इस इंटरफ़ेस को लागू (JSONObject this पुस्तकालय से आता है):

interface JSONSerializable{ 
    public JSONObject dump() throws JSONException //serializes object 
    public void load(JSONObject obj) throws JSONException //deserializes object 
} 
मेरे संग्रह के लिए पर java.util.list अधिक या कम इस तरह दिखता है आधारित

कोड:

class AwesomeList<T extends JSONSerializable> implements JSONSerializable{ 
    private LinkedList<T> items = new LinkedList<T>(); 
    ... 
    ... 

    public JSONObject dump() throws JSONException { 
     JSONObject result = new JSONObject(); 
     JSONArray a = new JSONArray(); 
     for(T i : items){ 
      a.put(i.dump()); 
     } 
     result.put("items", a); 
     return result; 
    } 

    public void load(JSONObject obj) throws JSONException{ 
     //here is my problem 
    } 
} 

मेरी समस्या यह है: जब मैं JSONObject से AwesomeList लोड करता हूं, तो मुझे इसके तत्व बनाना होगा, लेकिन यह असंभव है क्योंकि जावा मुझे

लिखने से मना कर देता है

मुझे इस कार्य के लिए अपना दृष्टिकोण कैसे संशोधित करना चाहिए?

+0

ईमानदारी से कहूं तो मैं नहीं दिख रहा है कि यह कैसे भी जाना जाता है के साथ काम करता प्रकार के। क्या आप JSON डेटा पैकेट में कक्षा के नाम संग्रहीत कर रहे हैं? – Perception

+0

नहीं, प्रत्येक ऑब्जेक्ट जानता है कि JSONObject से खुद को कैसे लोड किया जाए (यह वास्तव में केवल सहयोगी सरणी है)। मैंने यह दिखाने के लिए पोस्ट अपडेट किया कि मैं क्या करना चाहता हूं। – KCH

उत्तर

30

क्या आप इस पुस्तकालय से बंधे हैं? Google Gson बहुत लोकप्रिय है। मैंने खुद जेनरिक के साथ इसका इस्तेमाल नहीं किया है, लेकिन उनके सामने वाले पृष्ठ का कहना है कि जीसन जेनरिक के लिए बहुत महत्वपूर्ण मानते हैं।

+2

जीसन जेनरिक को बहुत अच्छी तरह से संभाल सकता है। – kingori

+3

पिछली बार जब मैंने चेक किया कि जीएसओ सर्कुलर संदर्भों को संभाल नहीं लेता है .. हालांकि एक अपडेट इसे ठीक कर सकता था .. मुझे [link] http://jackson.codehaus.org/ सबसे अच्छा लगता है। जेसन में जेनेरिक के साथ जेसन रूपांतरण कैसे करें [लिंक] http://stackoverflow.com/questions/5528385/json-conversion-using-gson –

+0

जीएसओएन का उपयोग बहुत ही सरल, बहुत आसान है। – schmijos

0

ठीक है, इसे फ़ाइल में लिखते समय, आप जानते हैं कि कक्षा टी क्या है, इसलिए आप इसे dump में स्टोर कर सकते हैं। फिर, इसे वापस पढ़ने पर, आप गतिशील रूप से प्रतिबिंब का उपयोग करके इसे कॉल कर सकते हैं।

public JSONObject dump() throws JSONException { 
    JSONObject result = new JSONObject(); 
    JSONArray a = new JSONArray(); 
    for(T i : items){ 
     a.put(i.dump()); 
     // inside this i.dump(), store "class-name" 
    } 
    result.put("items", a); 
    return result; 
} 

public void load(JSONObject obj) throws JSONException { 
    JSONArray arrayItems = obj.getJSONArray("items"); 
    for (int i = 0; i < arrayItems.length(); i++) { 
     JSONObject item = arrayItems.getJSONObject(i); 
     String className = item.getString("class-name"); 
     try { 
      Class<?> clazzy = Class.forName(className); 
      T newItem = (T) clazzy.newInstance(); 
      newItem.load(obj); 
      items.add(newItem); 
     } catch (InstantiationException e) { 
      // whatever 
     } catch (IllegalAccessException e) { 
      // whatever 
     } catch (ClassNotFoundException e) { 
      // whatever 
     } 
    } 
4

जैसा कि अन्य ने संकेत दिया है, आपको डंपिंग org.json की लाइब्रेरी पर विचार करना चाहिए। इन दिनों यह काफी अप्रचलित है, और इसकी समस्याओं के आसपास काम करने की कोशिश समय की बर्बादी है।

लेकिन विशिष्ट प्रश्न के लिए; टाइप वैरिएबल टी में आपकी मदद करने के लिए कोई जानकारी नहीं है, क्योंकि यह संकलन-समय की जानकारी से थोड़ा अधिक है। इसके बजाय आपको वास्तविक वर्ग ('क्लास क्ल्स' तर्क के रूप में) पास करने की आवश्यकता है, और फिर आप 'cls.newInstance()' के साथ एक उदाहरण बना सकते हैं।

0

क्या आपने कोशिश की है json-io (https://github.com/jdereg/json-io)?

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

JSON (और JSON जावा के लिए), तो आपको फ़ॉर्मेट करने के लिए (सुंदर प्रिंट) JSON उपयोग कर सकते हैं करने के लिए जावा के क्रमबद्धता के अलावा:

String niceFormattedJson = JsonWriter.formatJson(jsonString) 
संबंधित मुद्दे