आप प्रकार की जानकारी स्टोर करने के लिए JSON संरचना को संशोधित कर सकते हैं। यदि आपके पास आगे और आगे क्रमबद्ध करने और deserialize करने के लिए बहुत सारी वस्तुएं हैं, तो यह प्रत्येक ऑब्जेक्ट के लिए समय लिखने का कस्टम कोड सहेज लेगा।
यह भी ध्यान दें, यह JSON संरचना को संशोधित करता है और प्रत्येक कस्टम ऑब्जेक्ट में __type__
संपत्ति जोड़ता है। मुझे लगता है कि अलग कॉन्फ़िगरेशन फ़ाइलों को रखने से यह एक क्लीनर दृष्टिकोण है। तो आगे की हलचल के बिना, इस यह मूल रूप से कैसे काम करता है:
var fruitBowl = {..};
fruitBowl[0].eat();
fruitBowl[1].seeds[0].plant();
कॉल वस्तु पर क्रमानुसार एक JSON प्रतिनिधित्व वस्तुओं फिर से संगठित करने JSON इनकोडिंग स्ट्रिंग पर
var json = fruitBowl.serialize();
कॉल deserialize पाने के लिए
var resurrected = json.deserialize();
अब आप वस्तुओं पर गुणों और कॉल विधियों तक पहुंच सकते हैं:
resurrected[0].eat();
resurrected[1].seeds[0].plant();
यह गहरा घोंसला वाले वस्तुओं के किसी भी स्तर के लिए काम करता है, हालांकि यह अब के लिए थोड़ी छोटी गाड़ी हो सकती है। इसके अलावा यह क्रॉस-ब्राउजर नहीं है (केवल क्रोम पर परीक्षण किया जाता है)। चूंकि deserializer किसी ऑब्जेक्ट के कन्स्ट्रक्टर फ़ंक्शन से परिचित नहीं है, इसलिए यह मूल रूप से किसी भी पैरामीटर को पार किए बिना प्रत्येक कस्टम ऑब्जेक्ट बनाता है। मैंने jsfiddle पर http://jsfiddle.net/kSATj/1/ पर एक कामकाजी डेमो सेट किया है।
निर्माता समारोह दो तरीके यह वस्तुओं जावास्क्रिप्ट में सीधे
- निर्मित किया जा सकता
- JSON से पुन: तैयार
सभी कंस्ट्रक्टर्स निर्माण को समायोजित करने की आवश्यकता होगी है के लिए खाते में करने के लिए संशोधित किया जा सकता था दोनों सिरों से, इसलिए प्रत्येक प्रॉपर्टी को डिफ़ॉल्ट फ़ॉलबैक मान असाइन करने की आवश्यकता होती है, जिसमें कुछ भी पारित नहीं होता है।
function SomeObject(a, b) {
this.a = a || false; // defaultValue can be anything
this.b = b || null; // defaultValue can be anything
}
// one type of initialization that you can use in your code
var o = new SomeObject("hello", "world");
// another type of initialization used by the deserializer
var o = new SomeObject();;
o.a = "hello";
o.b = "world";
संदर्भ के लिए, संशोधित JSON लगता है:
function isNative(object) {
if(object == null) {
return true;
}
var natives = [Boolean, Date, Number, String, Object, Function];
return natives.indexOf(object.constructor) !== -1;
}
(प्रकार की जानकारी के साथ JSON में एक वस्तु को धारावाहिक:
{"fruitbowl":
[
{
"__type__": "Fruit",
"name": "apple",
"color": "red",
"seeds": []
},
{
"__type__": "Fruit",
"name": "orange",
"color": "orange",
"seeds":
[
{
"__type__": "Seed",
"size": "small",
"density": "hard"
},
{
"__type__": "Seed",
"size": "small",
"density": "soft"
}
]
}
]
}
यह सरल प्रकारों की पहचान करने के लिए सिर्फ एक सहायक समारोह है संरक्षित):
Object.prototype.serialize = function() {
var injectTypes = function(object) {
if(!isNative(object)) {
object.__type__ = object.constructor.name;
}
for(key in object) {
var property = object[key];
if(object.hasOwnProperty(key) && !isNative(property)) {
injectTypes(property);
}
}
};
var removeTypes = function(object) {
if(object.__type) {
delete object.__type__;
}
for(key in object) {
var property = object[key];
if(object.hasOwnProperty(key) && !isNative(property)) {
removeTypes(property);
}
}
}
injectTypes(this);
var json = JSON.stringify(this);
removeTypes(this);
return json;
};
deserialize (कस्टम वस्तुओं का पुनर्निर्माण के साथ):
String.prototype.deserialize = function() {
var rawObject = JSON.parse(this.toString());
var reconstruct = function(object) {
var reconstructed = {};
if(object.__type__) {
reconstructed = new window[object.__type__]();
delete object.__type__;
}
else if(isNative(object)) {
return object;
}
for(key in object) {
var property = object[key];
if(object.hasOwnProperty(key)) {
reconstructed[key] = reconstruct(property);
}
}
return reconstructed;
}
return reconstruct(rawObject);
};
अतिरिक्त क्रेडिट के लिए: मुझे किसी बिंदु पर "उदाहरण" के साथ अपने फल और बीज की पहचान करने की आवश्यकता हो सकती है। –