अपने ब्राउज़र में XML दस्तावेज़ों को JSON में बदलें। एट्रिब्यूट्स को @-उपसर्ग वाली कुंजियों के अंदर रखें, दोहराए गए एलिमेंट्स को सरणियों में समेटें और वैकल्पिक रूप से संख्याओं, बूलियन और null को प्रबलित करें।
XML को उस ऑब्जेक्ट ट्री के रूप में पढ़ें जो यह हमेशा बनना चाहता था। एक XML दस्तावेज़ चिपकाएँ और JSON वापस पाएँ। एट्रिब्यूट्स @-उपसर्ग कुंजियों के अंदर संरक्षित रहते हैं, दोहराए गए एलिमेंट्स सरणियों में समा जाते हैं, और प्रकार प्रबलन ऑप्ट-इन है ताकि पहचानकर्ता अपने अग्रणी शून्य रखें।
JSON आउटपुट
तीन समस्याएँ जिन्हें हर XML से JSON कनवर्टर को हल करना होता है
एट्रिब्यूट्स के जाने के लिए कोई स्वाभाविक जगह नहीं है
XML एट्रिब्यूट्स और चाइल्ड एलिमेंट्स के बीच एक दृढ़ रेखा खींचता है। <user id="7"><name>Ada</name></user> कुछ अलग कहता है <user><id>7</id><name>Ada</name></user> से, भले ही अधिकांश अनुप्रयोग उनसे समान रूप से व्यवहार करते हों। JSON में कोई समकक्ष भेद नहीं है, इसलिए किसी कनवर्टर को या तो एट्रिब्यूट्स को फेंकना होगा या उनके लिए कोई जगह गढ़नी होगी।
व्यापक रूप से उपयोग किया जाने वाला सम्मेलन, और यहाँ लागू किया गया, एट्रिब्यूट कुंजियों को @ उपसर्ग देता है और एलिमेंट टेक्स्ट को #text के अंदर संग्रहीत करता है जब किसी एलिमेंट में एट्रिब्यूट्स और सामग्री दोनों हों। इसलिए पहला उदाहरण {"user": {"@id": "7", "name": "Ada"}} बन जाता है। उपसर्ग किसी भी मानक का हिस्सा नहीं है, पर यह पर्याप्त सामान्य है कि अधिकांश डाउनस्ट्रीम कोड इसे पहचानता है, और यह रूपांतरण को उत्क्रमणीय रखता है। एट्रिब्यूट्स बंद करने से साफ़ आउटपुट मिलता है जब आप जानते हैं कि एट्रिब्यूट्स वे मेटाडेटा हैं जिनकी आपको ज़रूरत नहीं है।
एक वस्तु या एक की सूची?
यह वह समस्या है जिसका कोई सही उत्तर नहीं है। XML में, एकल <item> चाइल्ड वाला पैरेंट और पाँच वाला पैरेंट संरचनात्मक रूप से समान दिखते हैं, पर उन्हें क्रमशः एकल ऑब्जेक्ट और एक सरणी बनना ही चाहिए — और दस्तावेज़ में कुछ भी नहीं बताता कि स्कीमा का आशय किससे था। बिना स्कीमा वाले उपकरण को जो वह देखता है उससे अनुमान लगाना होता है।
यहाँ का नियम दोहराए गए सिबलिंग एलिमेंट नामों को एक सरणी में समेटना और एकाकी एलिमेंट को एकल मान छोड़ना है। यह पढ़ते समय सहजज्ञान से मेल खाता है, पर इसका अर्थ है कि आउटपुट का उपभोग करने वाले कोड को दोनों आकारों को संभालना होगा, क्योंकि कोई सूची जिसमें आज संयोग से एक प्रविष्टि है वह एक ऑब्जेक्ट उत्पन्न करेगी न कि एक-तत्व वाली सरणी। जब आप उपभोक्ता को नियंत्रित करते हैं, तो पुनरावृत्ति करने से पहले [].concat(value) जैसे किसी से सामान्यीकृत करें।
XML में सब कुछ एक स्ट्रिंग है
स्कीमा के बिना किसी XML दस्तावेज़ में कोई प्रकार नहीं होते। <count>42</count> और <sku>0042</sku> दोनों केवल टेक्स्ट हैं, और केवल कोई मनुष्य या कोई XSD ही जानता है कि एक संख्या है और दूसरा वह पहचानकर्ता है जिसे अपने शून्य रखने ही चाहिए।
यही कारण है कि प्रकार प्रबलन एक डिफ़ॉल्ट के बजाय एक चेकबॉक्स है। जब यह चालू हो, तो मान तभी परिवर्तित होते हैं जब गोल-यात्रा सटीक हो — कोई संख्यात्मक स्ट्रिंग केवल तभी संख्या बनती है जब उसे वापस फ़ॉर्मैट करने से वही टेक्स्ट बने, जो 0042, +7 और 1e999 की रक्षा करता है। true, false और खाली एलिमेंट्स बूलियन और null बन जाते हैं। जब यह बंद हो, तो हर मान एक स्ट्रिंग रहता है, जो पहचानकर्ताओं, फ़ोन नंबरों, पोस्टकोड्स और 2^53 से परे किसी भी पूर्णांक के लिए सुरक्षित चुनाव है जहाँ JavaScript संख्या शुद्धता मान को चुपचाप भ्रष्ट कर देगी।
FAQ
क्या मेरा XML कहीं अपलोड किया जाता है?
नहीं। पार्सिंग ब्राउज़र के निर्मित DOMParser का उपयोग करती है और JSON स्थानीय रूप से उत्पन्न होता है, इसलिए दस्तावेज़ कभी पेज को नहीं छोड़ता।
एट्रिब्यूट्स कैसे निरूपित किए जाते हैं?
एलिमेंट के चिल्ड्रन के साथ, @ उपसर्ग वाली कुंजियों के रूप में। यदि किसी एलिमेंट में एट्रिब्यूट्स और टेक्स्ट दोनों हों, तो टेक्स्ट को एक #text कुंजी के अंदर संग्रहीत किया जाता है।
एकल एलिमेंट सरणी क्यों नहीं बना?
बिना स्कीमा के कुछ भी नहीं बताता कि एक चाइल्ड का अर्थ एकल मान है या एक की सूची। दोहराए गए नाम सरणियाँ बन जाते हैं; एकाकी एलिमेंट एकल मान रहता है।
प्रकार प्रबलन क्या करता है?
यह संख्यात्मक, बूलियन और खाली मानों को टेक्स्ट से बदलता है। संख्याएँ तभी परिवर्तित होती हैं जब गोल-यात्रा सटीक हो, इसलिए 0042 और +7 स्ट्रिंग्स रहते हैं।
क्या मुझे प्रबलन बंद छोड़ना चाहिए?
हाँ, पहचानकर्ताओं, फ़ोन नंबरों, पोस्टकोड्स और 2^53 से परे पूर्णांकों के लिए, जहाँ JavaScript की संख्या शुद्धता मान को बिना चेतावनी के गोल कर देगी।
मुझे अमान्य XML त्रुटि क्यों मिलती है?
दस्तावेज़ वेल-फॉर्म्ड नहीं है: बंद न हुए या मेल न खाने वाले टैग, कोई एस्केप न किया गया & या <, या एक से अधिक रूट एलिमेंट सामान्य कारण हैं।