2016-10-17 8 views
5

के साथ JSON.stringify का उपयोग करके मैं टाइपस्क्रिप्ट में गेटर/सेटर एक्सेसर्स का उपयोग कर रहा हूं।टाइपस्क्रिप्ट गेटर/सेटर

private _major: number; 

get major(): number { 
    return this._major; 
} 
set major(major: number) { 
    this._major = major; 
} 
अब

जब मैं (JSON.stringify का उपयोग करें: यह एक चर और विधि के लिए एक ही नाम है संभव नहीं है के रूप में, मैं एक कम पानी का छींटा के साथ चर उपसर्ग के लिए, के रूप में कई उदाहरण में किया जाता है शुरू कर दिया) ऑब्जेक्ट को JSON स्ट्रिंग में कनवर्ट करने के लिए विधि, यह चर नाम को कुंजी के रूप में उपयोग करेगा: _major।

जैसा कि मैं नहीं चाहता कि जेएसओएन फ़ाइल में निचले डैश के साथ प्रीफिक्स की सभी चाबियाँ हों, क्या टाइपस्क्रिप्ट को उपलब्ध होने पर गेटटर विधि के नाम का उपयोग करने की कोई संभावना है? या गेटटर/सेटर विधियों का उपयोग करने के लिए कोई और तरीका है लेकिन अभी भी एक साफ JSON आउटपुट उत्पन्न करते हैं?

मुझे पता है कि स्ट्रिंग आउटपुट पर लिखे जाने से पहले JSON कुंजी मैन्युअल रूप से संशोधित करने के तरीके हैं। हालांकि अगर सरल समाधान है तो मैं उत्सुक हूं।

Here is a JSFiddle जो वर्तमान व्यवहार को प्रदर्शित करता है।

+1

मुझे लगता है कि गुणों के पूंजीकरण का उपयोग करने के लिए एक और दृष्टिकोण होगा, उदाहरण के लिए मेजर() ... गुणों के लिए सी # नामकरण सम्मेलन की तरह –

उत्तर

3

नहीं, आपके पास संपत्ति नाम के बजाय गेटर/सेटर नाम का उपयोग करके JSON.stringify नहीं हो सकता है।

लेकिन आप कुछ इस तरह कर सकते हैं:

class Version { 
    private _major: number; 

    get major(): number { 
     return this._major; 
    } 

    set major(major: number) { 
     this._major = major; 
    } 

    toJsonString(): string { 
     let json = JSON.stringify(this); 
     Object.keys(this).filter(key => key[0] === "_").forEach(key => { 
      json = json.replace(key, key.substring(1)); 
     }); 

     return json; 
    } 
} 

let version = new Version(); 
version.major = 2; 
console.log(version.toJsonString()); // {"major":2} 
+3

निम्नलिखित उत्तर के संदर्भ में, आप केवल अपने ऑब्जेक्ट पर एक toJSON फ़ंक्शन परिभाषित कर सकते हैं जो स्वचालित रूप से JSON.stringify (yourclassobject) https: // stackoverflow द्वारा उपयोग किया जाता है .com/question/29705211/object-defineproperty-on-a-prototype-prevents-json-stringify-from-serializing- –

+0

@ N15M0_jk हाँ, यह सच है, लेकिन मैं 'JSON के व्यवहार को" ओवरराइड "नहीं करना पसंद करता हूं। stringify' और इसके बजाय बस 'version.toJsonString() ' –

+0

का उपयोग करें कस्टम [toJSON()' विधि का उपयोग कर सकते हैं, जैसा कि [यहां] (https://developer.mozilla.org/en-US/docs/Web/ जावास्क्रिप्ट/संदर्भ/Global_Objects/JSON/स्ट्रिंग # toJSON() _ व्यवहार), हाँ? – menehune23

0

मैं गुण के माध्यम से पुनरावृत्ति लगता है और स्ट्रिंग छेड़खानी खतरनाक है। मैं वस्तु के ही प्रोटोटाइप, कुछ इस तरह का उपयोग कर करना होगा:

public static toJSONString() : string { 
    return JSON.stringify(this, Object.keys(this.constructor.prototype)); // this is version class 
} 
+0

यह काम कर रहा है, लेकिन यह केवल सेटर्स और गेटर्स को लौट रहा है। मैं उन सभी अन्य संपत्तियों को कैसे प्राप्त कर सकता हूं जो गेटर्स और सेटर्स नहीं हैं? – hsantos

2

@ जनवरी-Aagaard समाधान के आधार पर मैं आदेश toJSON विधि का उपयोग करने में यह एक

public toJSON(): string { 
    let obj = Object.assign(this); 
    let keys = Object.keys(this.constructor.prototype); 
    obj.toJSON = undefined; 
    return JSON.stringify(obj, keys); 
} 

का परीक्षण किया है

+0

इसे उत्तर स्वीकार किया जाना चाहिए – TeodorKolev