2010-11-26 13 views
18

तो, JSON.stringify एक जेएस ऑब्जेक्ट को चालू करने का एक शानदार तरीका प्रदान करता है जैसे:कस्टम JSJON विधि में JSON.stringify का उपयोग कैसे करते हैं?

var baz = {"foo":1, "bar":someFunction}; 

एक JSON स्ट्रिंग में:

{"foo":1} 

यह वैकल्पिक वैकल्पिक तर्क के साथ करता है जो किन फ़ील्ड को नियंत्रित करता है serialized किया जाना चाहिए:

JSON.stringify(baz, ["foo"]); 

यह बढ़िया है, लेकिन एक समस्या है। आइए मान लें कि आपका "बाज़" वास्तव में किसी अन्य ऑब्जेक्ट की संपत्ति है, और आप उस अन्य ऑब्जेक्ट को क्रमबद्ध करना चाहते हैं:

someObject.baz = {"foo":1, "bar":someFunction}; 
JSON.stringify(someObject, ["baz"]); 

ठीक है, आमतौर पर आप बस baz पर एक toJSON विधि को परिभाषित करेंगे, उदाहरण के लिए:

someObject.baz = {"foo":1, "bar":someFunction}; 
someObject.baz.toJSON = function() { /* logic to "toJSON" baz*/ } 
JSON.stringify(someObject, ["baz"]); 

अब, जैसा कि मैंने पहले उल्लेख किया था, हमारे पास "toJSON" baz के लिए पहले से ही एकदम सही तर्क है:

someObject.baz.toJSON = function() { 
    return JSON.stringify(baz, ["foo"]); 
} 

लेकिन यदि आप इसे अपने toJSON में डालने का प्रयास करते हैं, तो आपको एक रिकर्सन त्रुटि मिल जाएगी, क्योंकि स्ट्रिंग करें toJSON को ट्रिगर करेगा, जो स्ट्रिंग को ट्रिगर करेगा, जो ... :-(

आप इसे हैक के साथ काम कर सकते हैं:

someObject.baz.toJSON = function() { 
    var oldToJON = this.toJSON; 
    this.toJSON = null; 
    var ret = JSON.stringify(baz, ["foo"]); 
    this.toJSON = oldToJON; 
    return ret; 
} 

लेकिन ... यह गलत लगता है। तो, मेरा सवाल यह है कि क्या आप किसी भी तरह से के अंदर JSON.stringify की निफ्टी अंतर्निहित धारावाहिक शक्ति का उपयोग कर सकते हैं किसी ऑब्जेक्ट की एक toJSON विधि (बिना स्ट्रिंग ऑपरेशन के दौरान toJSON विधि को छिपाने के बिना)?

उत्तर

31

Crockford's json2.js का कहना है:

एक toJSON विधि को क्रमानुसार नहीं करता है: यह नाम/मान युग्म कि धारावाहिक किया जाना चाहिए, या अपरिभाषित अगर कुछ श्रृंखलाबद्ध किया जाना चाहिए द्वारा प्रतिनिधित्व मान देता है।

तो आपको बस उस मूल्य को वापस करने की उम्मीद है जिसे आप क्रमबद्ध करना चाहते हैं। आपके मामले में, baz.toJSON बस baz उद्देश्य यह है कि आप धारावाहिक चाहते का भाग वापस लौटा देना चाहिए:

someObject.baz.toJSON = function() { 
    return { foo: this.foo }; 
}; 
+0

तो फिर अगर मैं केवल कुछ फ़ील्ड को क्रमानुसार करना चाहते हैं, मैं क्या करना है: – machineghost

+0

someObject.baz.toJSON = समारोह () { var ret = {}; (इस में वर संपत्ति) { if (! ListOfPropertiesToSerialize में संपत्ति) जारी रखने के लिए ; ret [property] = यह [संपत्ति; } वापसी सेवानिवृत्त; }; – machineghost

+0

केवल फ़ील्ड की सूची प्रदान करने का कोई तरीका नहीं है और अंतर्निहित JSON सामान (चाहे यह क्रॉकफ़ोर्ड या ब्राउज़र-आपूर्ति वाले लोग हैं) फ़िल्टर चीजों को फ़िल्टर करें, जिस तरह से स्ट्रिंग विधि है? – machineghost

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