हर JSON डॉक्यूमेंट पहले से एक वैलिड JavaScript एक्सप्रेशन है। आप JSON
को एक const config = असाइनमेंट में पेस्ट कर सकते हैं और यह रन
होता है। दिलचस्प काम उल्टा है: असली JavaScript ऑब्जेक्ट लिटरल्स
ऐसी चीज़ों से भरे होते हैं जो JSON मना करता है, और एक कनवर्टर जो
अनुमान लगाता है कि वे क्या थे, डेटा खो देता है जबकि सफलता
रिपोर्ट करता है।
JSON to JavaScript कनवर्टर का उपयोग करना
एक दिशा चुनें और Convert दबाएं। JavaScript में लिखते समय, एक
ऑब्जेक्ट की कुंजी जो एक वैलिड आइडेंटिफ़ायर है बिना कोट के लिखी
जाती है, इसलिए "name" बन जाता है name, जबकि "display name"
जैसी कुंजी कोट के साथ रहती है क्योंकि इसे बिना कोट के लिखने से
इसकी वर्तनी बदल जाती है। एक खाली ऑब्जेक्ट या एरे एक ही पंक्ति
में रहता है। नंबर्स टोकन स्ट्रीम से होकर जाते हैं JSON.parse से
नहीं, इसलिए एक बीस अंकों का इंटेजर बीसों अंकों के साथ वापस आता है।
रीडर क्या स्वीकार करता है
JavaScript को वापस JSON में पढ़ते समय, टूल उन ऑब्जेक्ट लिटरल्स
को समझता है जो आप वास्तव में कॉन्फ़िग फ़ाइल से पेस्ट करेंगे:
बिना कोट की कुंजीज़, सिंगल कोटेड स्ट्रिंग्स, // और /* */
कमेंट्स, ट्रेलिंग कॉमा, और आगे एक वैकल्पिक const, let या var
नाम और अंत में सेमीकॉलन। बिना इंटरपोलेशन का एक टेम्पलेट लिटरल
भी स्वीकार किया जाता है, क्योंकि इसमें प्लेन टेक्स्ट होता है।
JSON द्वारा अस्वीकृत नंबर की वर्तनी को इसके एकदम JSON रूप में नॉर्मलाइज़ किया जाता है:
const numbers = { a: .5, b: 5., c: 5.e3 }
{
"a": 0.5,
"b": 5,
"c": 5e3
}
क्या रिजेक्ट होता है, और क्यों
JSON जो भी नहीं रख सकता वह नाम से रिजेक्ट होता है अनुमान लगाने
के बजाय। undefined, NaN और Infinity का कोई JSON नंबर या वैल्यू
नहीं है, इसलिए वे रिजेक्ट होते हैं। हेक्स, ऑक्टल और बाइनरी नंबर्स,
अंडरस्कोर डिजिट सेपरेटर्स जैसे 1_000, और लीडिंग ज़ीरो भी,
जिनमें से सभी का अर्थ बदल जाता अगर JSON इन्हें पढ़ता। एक रेगुलर
एक्सप्रेशन, एक फंक्शन, एक नंगा शब्द, और ${...} टेम्पलेट
इंटरपोलेशन भी रिजेक्ट होते हैं, क्योंकि वे कोड हैं, डेटा नहीं।
दो रिजेक्शंस को करीब से देखने के लायक हैं। एक ऑब्जेक्ट में दो
बार दिखने वाली कुंजी रिजेक्ट होती है, क्योंकि JSON के पास एक ही
नाम के नीचे दोनों वैल्यूज़ रखने का कोई तरीका नहीं है। और __proto__
कुंजी जिसका मान ऑब्जेक्ट या null है रिजेक्ट होती है, क्योंकि
JavaScript ऑब्जेक्ट लिटरल में वह वर्तनी एक प्रॉपर्टी नहीं बनाती।
यह नए ऑब्जेक्ट का प्रोटोटाइप सेट करती है, इसलिए इसे साधारण
__proto__ कुंजी के साथ JSON में बदलने से एक ऐसी प्रॉपर्टी बन
जाती जो मूल कोड में कभी नहीं थी।
क्यों undefined डिफ़ॉल्ट में null में नहीं बदला जाता
JSON में undefined नहीं है, इसलिए कनवर्टर को कुछ करना होता है।
null लिखने से चुपचाप डेटा का मतलब बदल जाता है: एक कॉन्फ़िग
ऑब्जेक्ट में undefined आमतौर पर मतलब है कि फ़ील्ड अभी कॉन्फ़िग
नहीं है, जो उस null से अलग है जिसे कोड बाद में चेक करता है।
टूल डिफ़ॉल्ट में रिजेक्ट करता है, और Convert undefined to null
ऑप्शन तब के लिए है जब आप सच में वह मतलब चाहते हैं।
राउंड ट्रिपिंग
एक डॉक्यूमेंट को दूसरे फ़ॉर्मेट में बदलना यह सच्ची परीक्षा है कि कोटिंग और रिजेक्शन नियम सही हैं या नहीं। बिना कोट की कुंजीज़, सिंगल कोट्स और ट्रेलिंग कॉमा वाला ऑब्जेक्ट लिटरल JSON के रूप में वापस आता है हर कुंजी कोटेड और हर अंक इंटैक्ट, और उस JSON को फिर से बदलने पर वही ऑब्जेक्ट वापस मिलता है। गलत नियम आमतौर पर तभी दिखता है जब आप वापस बदलकर तुलना करते हैं।