नमस्कार, हेब्र! मैं JSON ऑब्जेक्ट्स को कक्षाओं में रखने के लिए आपके साथ अपनी लाइब्रेरी साझा करना चाहता हूं, जो स्वचालित रूप से टाइप करके इनपुट डेटा को मान्य करता है।
कुछ समय पहले, जावास्क्रिप्ट में कक्षाएं दिखाई देने वाली ऐसी अद्भुत चीज थी, जिसने कोड लिखने की प्रक्रिया को बहुत सरल कर दिया था। लेकिन दुर्भाग्य से JSON को इन समान वर्गों में शामिल करने की कार्यक्षमता प्रकट नहीं हुई, अर्थात आप एक स्ट्रिंग में एक वर्ग को क्रमबद्ध कर सकते हैं, लेकिन अपने दम पर वापस। और इस खामी को ठीक करने के लिए,
ts-serializable पुस्तकालय लिखा गया था जिसे मैं आपके साथ साझा करना चाहता हूं।
समस्या का सार निम्नलिखित कोड द्वारा दिखाया गया है:
export class User { public firstName: string = ""; public lastName: string = ""; public birthDate: Date = new Date(); public getFullName(): string { return [this.firstName, this.lastName].join(' '); } public getAge(): number { return new Date().getFullYear() - this.birthDate.getFullYear(); } } const ivan = new User(); ivan.getFullName();
नए इवान की गलतियों का कारण क्या है? तथ्य यह है कि JSON.parse विधि उपयोगकर्ता वर्ग के लिए नहीं है, लेकिन ऑब्जेक्ट वर्ग के लिए, जिसमें बस getFullName और getAge विधियाँ नहीं हैं।
मेरा पुस्तकालय इस समस्या को हल करने में कैसे मदद करता है और वस्तु के बजाय उपयोगकर्ता में इसका वर्णन करता है? यह कोड को थोड़ा संशोधित करने के लिए पर्याप्त है:
import { jsonProperty, Serializable } from "ts-serializable"; export class User extends Serializable { @jsonProperty(String) public firstName: string = ""; @jsonProperty(String) public lastName: string = ""; @jsonProperty(Date) public birthDate: Date = new Date(); public getFullName(): string { return [this.firstName, this.lastName].join(' '); } public getAge(): number { return new Date().getFullYear() - this.birthDate.getFullYear(); } } const ivan = new User(); ivan.getFullName(); // ivan.getAge(); // ivan instanceof User; // const text = JSON.stringify(ivan); // const newIvan = new User().fromJson(JSON.parse(text)); // User newIvan.getFullName(); // newIvan.getAge(); // newIvan instanceof User; //
सब कुछ बहुत सरल है। हम अपनी कक्षा को Serializable वर्ग से विरासत में लेते हैं, जिसमें क्रमांकन के लिए deserialization और toson के दो तरीके हैं, और हम JSON से स्वीकार करने की अनुमति वाले गुणों के साथ @jsonProperty डेकोरेटर को लटकाते हैं। अमान्य डेटा को अनदेखा किया जाएगा, कंसोल को एक चेतावनी जारी की जाएगी, और संपत्ति में डिफ़ॉल्ट मूल्य रहेगा।
वह मूल रूप से यह है। अब सामने की तरफ, आप सी #, जावा, और अन्य भाषाओं में जितनी आसानी से कर सकते हैं उतनी आसानी से वर्णन और अनुक्रमित कर सकते हैं। न्यूटनसॉफ्ट Json.NET के व्यवहार पर आधारित है।
पूछे जाने वाले प्रश्न
क्यों सीरियल से विरासत में मिली?मॉडल में दो toJson और toJSON विधियों को जोड़ने के लिए। आप डेकोरेटर या बंदर पैचिंग के माध्यम से भी ऐसा कर सकते हैं। लेकिन विरासत टाइपस्क्रिप्ट के लिए एक अधिक उचित तरीका है।
डेटा सत्यापन कैसे होता हैडेकोरेटर में, आपको उन डेटा प्रकारों के एक निर्माता को असाइन करना होगा जिन्हें JSON से स्वीकार करने की अनुमति है। बूलियन, स्ट्रिंग, संख्या ऑब्जेक्ट क्रमशः बूलियन, स्ट्रिंग, संख्या वापस कर देंगे। यदि आपको किसी सरणी को स्वीकार करने की आवश्यकता है, तो सरणी के कोष्ठकों द्वारा टाइप किया जाता है, उदाहरण के लिए @jsonProperty ([स्ट्रिंग])। यदि कंस्ट्रक्टर को सीरियल योग्य श्रेणी से विरासत में मिला है, तो यह भी वर्ग में deserialized होगा, यदि नहीं, तो ऑब्जेक्ट वापस कर दिया जाएगा।
सत्यापन त्रुटियों को कैसे पकड़ें?डिफ़ॉल्ट रूप से, लायब्रेरी केवल सत्यापन त्रुटियों के बारे में कंसोल को चेतावनी लिखती है। इस व्यवहार को ओवरराइड करने के लिए, जैसे अपवादों को फेंकना या बैकएंड पर लॉग इन करना, आपको मॉडल के ऑनट्रॉन्गाइप विधि को ओवरराइड करना चाहिए।
बोनस 1. गहरी प्रति।
const user1 = new Uesr(); const user2 = new User().fromJson(user1);
बोनस 2. आलसी दृश्यमॉडल।
यदि आपको अतिरिक्त डेटा के साथ एक मॉडल बनाने की आवश्यकता है, उदाहरण के लिए विचारों के लिए, लेकिन जो बैकएंड स्वीकार नहीं करता है, आप बस नए गुणों के साथ मॉडल का विस्तार कर सकते हैं और इन गुणों को @jsonIgnore डेकोरेटर के साथ चिह्नित कर सकते हैं। और फिर इन गुणों को क्रमबद्ध नहीं किया जाएगा।
import { jsonProperty, Serializable } from "ts-serializable"; export class User extends Serializable { @jsonProperty(String) public firstName: string = ""; @jsonIgnore() public isExpanded: boolean = false; } JSON.stringify(new User());