2012-08-29 12 views
6

मेरे पास मेरे क्लाइंट पक्ष पर जावास्क्रिप्ट ऑब्जेक्ट्स की एक सूची है, जो कि "ईवेंट" की एक सूची है जिसे उपयोगकर्ता ने निष्पादित किया है। जब उपयोगकर्ता तैयार होता है, तो मैं इसे सर्वर पर भेजना चाहता हूं। घटनाओं का क्रम महत्वपूर्ण है, इसलिए सूची आदेश को संरक्षित करना जरूरी है।JSON Polymorphism

मैं क्या करना चाहता हूं कि जेएसओएन लाइब्रेरी (जो कोई भी नहीं) जेएसओएन को मेरे जावा कोड में कुछ इवेंट ऑब्जेक्ट्स से बांधने के लिए है, जहां इवेंट एक सार वर्ग है, और मेरे पास 3 ठोस वर्ग हैं कि सभी घटनाओं का विस्तार करें (इवेंट ए, इवेंट बी और इवेंटसी कहें)। जैसे

List<Event> events = jsonlibrary.deserialise(jsonString); 

कुछ

आदर्श परिदृश्य होगा जो इस तरह के रूप

[eventA, eventC, eventA, eventA, eventB] 

मदों की एक सूची हो सकती है और यह संभव है, या मैं मैन्युअल रूप से JSON पेड़ का निरीक्षण करने की क्या ज़रूरत है, deserialise जेसन सरणी के व्यक्तिगत तत्व?

उत्तर

6

JSON ऑब्जेक्ट्स केवल कुंजी/मूल्य जोड़े हैं और इसमें कोई प्रकार की जानकारी नहीं है। इसका मतलब है कि JSON ऑब्जेक्ट के प्रकार को स्वचालित रूप से पहचानना संभव नहीं है। आप किस प्रकार की घटना से निपट रहे हैं, यह जानने के लिए आपको सर्वर-साइड पर कुछ तर्क लागू करना होगा।

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

+0

जिस तरह से मैं जा रहा था। उम्मीद थी कि वहां एक लाइब्रेरी थी जो प्रकार की जानकारी को कम करने के लिए थोड़ा प्रतिबिंब कर सकती थी, या शायद – Codemwnci

+0

से कक्षाओं को चुनने के लिए ऑब्जेक्ट क्लास की ऑब्जेक्ट क्लास की एक सूची पास कर सकती है, मैं अब आपकी विधि के साथ जा रहा हूं। चूंकि मेरे पास केवल सीमित संख्या में कक्षाएं हैं, इसलिए मैं बेस क्लास को सीमित पेड़ ट्रैवर्सल के साथ deserialise कर सकते हैं। – Codemwnci

1

आप गैन्सन लाइब्रेरी http://code.google.com/p/genson/ का उपयोग कर सकते हैं। यदि जेसन को गैन्सन का उपयोग करके उत्पादित किया गया तो यह कंक्रीट प्रकारों को deserialize कर सकते हैं। विकी है

// an example 
abstract class Event { 
String id; 
} 

class Click extends Event { 
double x, y; 
} 

// you can define aliases instead of plain class name with package (its a bit nicer and more secure) 
Genson genson = new Genson.Builder().setWithClassMetadata(true).addAlias("click", 
      Click.class).create(); 
String json = "[{\"@class\":\"click\", \"id\":\"here\", \"x\":1,\"y\":2}]"; 

// deserialize to an unknown type with a cast warning 
List<Event> events = genson.deserialize(json, List.class); 

// or better define to which generic type 
GenericType<List<Event>> eventListType = new GenericType<List<Event>>() {}; 
events = genson.deserialize(json, eventListType); 

संपादित करें यहाँ : नहीं तो आप केवल [... { "my.java.class", "गुण के बाकी" "@class"}] की तरह कुछ जोड़ने की जरूरत उदाहरण http://code.google.com/p/genson/wiki/GettingStarted#Interface/Abstract_classes_support

1

jackson json library का उपयोग क्यों नहीं करते?

यह डेटा बाध्यकारी कार्यशीलता वाला एक पूर्ण ऑब्जेक्ट/JSON मैपर है।

यह तेज़, छोटा पदचिह्न, दस्तावेज, अति उपयोग, और कई अन्य चीजें हैं जिनका आप आनंद लेंगे!

0

मैं एक पुस्तकालय है कि अगर json ही पुस्तकालय द्वारा इनकोडिंग (json और xml के लिए) वांछित fonctionality लागू करता है शुरू किया:

https://github.com/giraudsa/serialisation

इसका इस्तेमाल करने, MyObject myObject = new SpecialisedObject();

String json = JsonMarshaller.ToJson(myObject); 
MyObject myClonedObject = JsonUnMarshaller(json);