डेवलपर टूल · सिंटेक्स कन्वर्टर्स
YAML से JSON प्रकार की ज़बरदस्ती: हाँ, नहीं और 0777 कैसे अर्थ बदल देते हैं
· यह काम किस प्रकार करता है
yaml json डेटा-प्रारूप
YAML गैर-उद्धृत स्केलरों को प्रकारों में हल करता है, और नियम YAML 1.1 और 1.2 के बीच भिन्न होते हैं। यह पोस्ट बिल्कुल दिखाती है कि एक कन्वर्टर कैसे तय करता है कि एक मान एक बूलियन, एक पूर्णांक, एक फ्लोट या एक स्ट्रिंग है, और परिणाम को कैसे नियंत्रित किया जाए।
वह मान जो सत्य के रूप में वापस आया - एक सादा YAML स्केलर जिसका अर्थ पाठ के रूप में था, JSON को बूलियन के रूप में परिवर्तित किया गया, और वह सेवा जिसने तब गलत व्यवहार किया
`NO` जैसा मान YAML 1.1 लोडर में गलत हो सकता है, लेकिन यह कन्वर्टर ऐसा नहीं करता है। दोनों ToolAcre विकल्प YAML 1.2 स्कीमा का उपयोग करते हैं, इसलिए `NO`, `yes`, `no`, `on` और `off` स्ट्रिंग बने रहते हैं। सही किया गया उद्घाटन मायने रखता है क्योंकि एक उदाहरण यह दावा करता है कि यह पैनल `NO` को सही या गलत में बदल देता है, इसके परीक्षण किए गए व्यवहार के विपरीत सिखाएगा।
प्रकार के आश्चर्य अभी भी मौजूद हैं। डिफ़ॉल्ट JSON स्कीमा के अंतर्गत, `null` शून्य है जबकि `~`, एक खाली मान और `0o755` स्ट्रिंग बने रहते हैं। कोर का चयन करने से वे तीन रूप शून्य, शून्य और 493 में बदल जाते हैं। आउटपुट सटीक रूप से उपयोगी है क्योंकि यह हल किए गए JavaScript मान को उजागर करता है, न कि यह दिखावा करता है कि प्रत्येक सादे YAML टोकन में एक स्पष्ट प्रकार होता है।
वह मान जो पाठ को YAML 1.2 के अंतर्गत रखता है
अंतर्निहित समाधान तब होता है जब js-yaml स्रोत को पढ़ता है। चयनित प्रतिबंधित स्कीमा यह तय करती है कि कन्वर्टर के JSON लिखने से पहले एक सादा स्केलर शून्य, बूलियन या संख्यात्मक रूप से मेल खाता है या नहीं। उद्धरण उस निर्णय को दरकिनार कर देता है: `"0o755"` किसी भी स्कीमा के अंतर्गत पाठ है, और एक ब्लॉक स्केलर एक स्ट्रिंग बना रहता है जिसमें इसके चॉम्पिंग संकेतक द्वारा दर्शाए गए लाइन ब्रेक भी शामिल हैं।
यह पार्सिंग और क्रमांकन है, नियमित-अभिव्यक्ति प्रतिस्थापन नहीं। पाठक स्ट्रिंग्स, संख्याएँ, बूलियन, नल, सरणियाँ और ऑब्जेक्ट बनाता है; `JSON.stringify` फिर चयनित इंडेंटेशन के साथ उन मानों को उत्सर्जित करता है। टिप्पणियाँ और टोकन वर्तनी पहले से ही लेखन चरण से चली गई हैं, इसलिए कोई भी क्रमबद्धकर्ता यह पुनर्निर्माण नहीं कर सकता है कि कोई संख्या मूल रूप से दशमलव थी या किसी अन्य स्वीकृत YAML नोटेशन में लिखी गई थी।
YAML 1.1 नियम - हाँ/no/on/off बूलियन, 0777 ऑक्टल के रूप में, 1:30 सेक्सजेसिमल के रूप में, और 1.10 जैसे संस्करण स्ट्रिंग्स को फ़्लोट के रूप में पढ़ा जाता है
रूपरेखा YAML 1.1 जबरदस्ती को सूचीबद्ध करती है जैसे कि सेक्सजेसिमल टाइम और लीगेसी ऑक्टल। वे प्रासंगिक संगतता खतरे हैं, लेकिन वे यहां उपलब्ध मोड नहीं हैं। ToolAcre जानबूझकर 1.1 स्कीमा पेश नहीं करता है। इसका UI कहता है कि कोई भी शिप किया गया विकल्प `NO` को गलत नहीं पढ़ता है, और परीक्षण उस देश कोड और हां, नहीं, शब्दों को स्ट्रिंग के रूप में पिन करता है।
वह सीमा डिबगिंग विधि को बदल देती है। यदि कोई अन्य एप्लिकेशन उन शब्दों को बूलियन में बदल देता है, तो समान आउटपुट की अपेक्षा करने के बजाय उसके पार्सर कॉन्फ़िगरेशन की तुलना ToolAcre से करें। कन्वर्टर यह दिखा सकता है कि उसके अपने दो स्कीमा क्या उत्पन्न करते हैं; यह CI रनर, फ्रेमवर्क या परिनियोजन सिस्टम द्वारा उपयोग किए गए स्कीमा या संस्करण को प्रमाणित नहीं कर सकता है जो बाद में फ़ाइल का उपभोग करता है।
YAML 1.1 जबरदस्ती ऐसे खतरे हैं जिनसे यह कन्वर्टर बचता है
डिफ़ॉल्ट JSON स्कीमा केवल JSON के मॉडल के साथ संगत स्केलर वर्तनी स्वीकार करता है। कोर परिचित YAML शून्य रूप, हेक्साडेसिमल और ऑक्टल पूर्णांक, अनंत और NaN जोड़ता है। कोर अभी भी एक प्रतिबंधित लोडर के अंदर रहता है: भाषा-विशिष्ट ऑब्जेक्ट टैग, दिनांक, सेट, ऑर्डर किए गए मानचित्र और बाइनरी टैग निर्माण के बजाय अस्वीकार कर दिए जाते हैं।
अनंत और NaN एक और सीमा प्रकट करते हैं। JavaScript उन्हें पकड़ सकता है, लेकिन JSON उन्हें लिख नहीं सकता। कन्वर्टर प्रत्येक पथ की पहचान करता है और चेतावनी देता है कि मान शून्य हो गया है। यह एक स्वीकृत हानिपूर्ण कदम है, हानिरहित रूपांतरण नहीं। उद्धृत `.inf` इससे बचता है क्योंकि तब मान शाब्दिक स्ट्रिंग `.inf` रहता है।
भेजे गए दो YAML 1.2 स्कीमा केवल दस्तावेज़ीकृत स्केलर प्रपत्रों पर भिन्न हैं
`tilde: ~`, `empty:`, `octal: 0o755`, `country: NO` और `answer: yes` चिपकाएँ। सख्त चयन के साथ, JSON मान `"~"`, `""`, `"0o755"`, `"NO"` और `"yes"` हैं। कोर चयनित होने पर, केवल पहले तीन परिवर्तन होते हैं: टिल्ड और खाली शून्य हो जाते हैं, और ऑक्टल 493 हो जाते हैं। देश और उत्तर दोनों आउटपुट में टेक्स्ट रहते हैं।
अब प्रत्येक मान उद्धृत करें और दोहराएं। दोनों स्कीमा स्ट्रिंग लौटाते हैं क्योंकि स्रोत इच्छित प्रकार बताता है। यह तुलना कोड-सटीक है और एक टूल के अंदर YAML 1.1 को 1.2 के साथ तुलना करने से अधिक उपयोगी है जो 1.1 को कभी लोड नहीं करता है। यह अकेले उसके दस्तावेज़ीकरण से अनुमान लगाए बिना किसी अन्य पार्सर की जाँच करने के लिए एक समीक्षा योग्य स्थिरता भी देता है।
कार्यान्वित उदाहरण: ToolAcre के सख्त और कोर स्कीमा के अंतर्गत एक फ़ाइल
स्पष्ट मानक टैग केवल तभी स्वीकार किए जाते हैं जब प्रतिबंधित स्कीमा उन्हें पहचानती है: `!!str 123` स्ट्रिंग `123` बन जाती है, जबकि `!!int "7"` संख्या 7 बन जाती है। `!!binary`, `!!timestamp`, `!!set`, `!!js/function` और Python ऑब्जेक्ट कंस्ट्रक्टर जैसे टैग अस्वीकार कर दिए जाते हैं। यह YAML रीडर को एक मनमाना-ऑब्जेक्ट फ़ैक्टरी बनने से रोकता है।
जब कोई कॉन्फ़िगरेशन मान केवल टाइप किया हुआ दिखता है तो उद्धरण पोर्टेबल विकल्प बना रहता है। यह किसी अन्य टूल से बचे किसी स्पष्ट टैग पर निर्भर हुए बिना अग्रणी शून्य, संस्करण वर्तनी और प्रहरी शब्दों को संरक्षित करता है। JSON परिणाम चुने हुए प्रकार को दिखाता है, लेकिन यह उस उद्धरण शैली या टैग को नहीं ले जा सकता जिसने वह मान उत्पन्न किया है।
इसमें क्या शामिल नहीं है - परिणामी JSON का एप्लिकेशन-स्तरीय पार्सिंग, जो फिर से प्रकारों को बाध्य कर सकता है (उदाहरण के लिए, स्ट्रिंग '1' को नंबर पर)
एप्लिकेशन कोड परिणामी JSON को फिर से बाध्य कर सकता है। एक API `"1"` को पढ़ सकता है और इसे एक संख्या में परिवर्तित कर सकता है, या किसी स्कीमा के विरुद्ध इसे अस्वीकार कर सकता है। सिंटैक्स कन्वर्टर्स JSON टेक्स्ट बनाने के बाद बंद हो जाते हैं; यह फ़्रेमवर्क सत्यापनकर्ता, पर्यावरण-परिवर्तनीय लोडर या व्यावसायिक नियम नहीं चलाता है। इसलिए एक स्वच्छ रूपांतरण सिंटैक्स और मैपिंग को साबित करता है, न कि अंतिम सेवा द्वारा स्वीकृति को।
डुप्लिकेट YAML कुंजियाँ एक अलग मुद्दा हैं। ToolAcre अंतिम मान रखता है और स्थिति के साथ दोहराई गई कुंजी की रिपोर्ट करता है। बहु-दस्तावेज़ धाराएँ सारणी बन जाती हैं। वे विकल्प बदल सकते हैं कि कोई एप्लिकेशन क्या देखता है, भले ही प्रत्येक स्केलर प्रकार अपेक्षित हो, इसलिए केवल स्वरूपित JSON बॉडी का मूल्यांकन करने के बजाय चेतावनियाँ पढ़ें।
टेकअवे: ऐसी कोई भी चीज़ उद्धृत करें जिसे कोई मशीन गलत तरीके से पढ़ सके - और ब्राउज़र में YAML को JSON में परिवर्तित करने से पता चलता है कि प्रत्येक स्केलर ने वास्तव में क्या हल किया है
मशीन टोकन जैसा दिखने वाला टेक्स्ट उद्धृत करें, फिर JSON प्रकारों का निरीक्षण करें। जब आप सबसे छोटी JSON-आकार की अदिश शब्दावली चाहते हैं तो सख्त का उपयोग करें; जब YAML शून्य और संख्यात्मक रूपों की आवश्यकता हो तो जानबूझकर कोर चुनें। कोई भी विकल्प YAML 1.1 नहीं है, और न ही किसी डाउनस्ट्रीम उपभोक्ता को समान नियमों का पालन करने के लिए मजबूर करता है।
पैनल अपने पार्सर विकल्प को दृश्यमान बनाता है और उन मानों के लिए चेतावनी देता है जिन्हें कोई लक्ष्य प्रदर्शित नहीं कर सकता। यह ईमानदार वादा है: इससे पता चलता है कि इस कार्यान्वयन ने प्रत्येक स्केलर को कैसे हल किया। यह सार्वभौमिक YAML व्यवहार का दावा नहीं करता है या राउंड ट्रिप के माध्यम से टिप्पणियों, टैग और वर्तनी को संरक्षित नहीं करता है।