2014-09-22 7 views
10

मैं इस त्रुटि का बिल्कुल संदर्भ नहीं ढूंढ पा रहा हूं, लेकिन वाईएएमएल 1.2 का कहना है कि यह एक JSON सुपरसेट है, और यदि मैं JSON में टैब वर्णों का उपयोग करता हूं तो यह एक त्रुटि की तरह व्यवहार करता है।वाईएएमएल जेएसओएन सुपरसेट और टैब अक्षरों के रूप में

उदा।

"root": { 
     "key": "value" 
} 

(ऑनलाइन सत्यापन here का कहना है कि '\t' that cannot start any token)

मैं जानता हूँ कि क्यों YAML ऐतिहासिक टैब की अनुमति नहीं देता है, लेकिन मैं कैसे JSON-सुपरसेट के संदर्भ में यह व्याख्या कर सकते हैं?

(जैसे YAML न कि वास्तविक सुपरसेट है या JSON भी टैब नामंज़ूर है? या कल्पना इस मामले में टैब के लिए अनुमति नहीं है लेकिन कार्यान्वयन अभी तक वहाँ नहीं है?)

धन्यवाद।

उत्तर

6

टैब को YAML में अनुमति दी गई है, लेकिन केवल जहां इंडेंटेशन लागू नहीं होता है।

YAML 1.2 Section 5.5 के अनुसार: अंतरिक्ष और टैब:

YAML दो सफेद स्थान पात्रों को पहचानता है।

निम्न उदाहरण · का उपयोग रिक्त स्थान को निरूपित करने के होगा और टैब निरूपित करने के लिए। सभी उदाहरण आधिकारिक YAML Reference Parser का उपयोग करके सत्यापित किए जा सकते हैं।

वाईएएमएल में ब्लॉक शैली और प्रवाह शैली है। ब्लॉक शैली में, इंडेंटेशन एक दस्तावेज़ की संरचना निर्धारित करता है। निम्न दस्तावेज़ ब्लॉक शैली का उपयोग करता है।

root: 
··key: value 

Validate

प्रवाह शैली में, विशेष वर्ण दस्तावेज़ की संरचना संकेत मिलता है। निम्नलिखित समकक्ष दस्तावेज़ प्रवाह शैली का उपयोग करता है।

{ 
→ root: { 
→ → key: value 
→ } 
} 

Validate

तुम भी प्रवाह शैली में खरोज मिश्रण कर सकते हैं।

{ 
→ root: { 
··→ key: value 
····} 
} 

Validate

आप ब्लॉक मिश्रण और शैली प्रवाह कर रहे हैं, हर कदम की शैली हिस्सा ब्लॉक शैली खरोज आदर करना चाहिए।

root: 
··{ 
····key: value 
··} 

Validate

लेकिन आप अभी भी प्रवाह शैली भाग के भीतर अपने खरोज मिश्रण कर सकते हैं।

root: 
··{ 
··→ key: value 
··} 

Validate

आप एक ही मूल्य दस्तावेज़ है, तो आप सफेद स्थान के सभी तरह के साथ मूल्य घेर कर सकते हैं।

→ ··value··→ 

Validate

बिंदु है, हर JSON दस्तावेज है कि YAML के रूप में पार्स किया गया है दस्तावेज़ प्रवाह शैली में (प्रारंभिक { या [ चरित्र की वजह से), रखा जाएगा जो टैब का समर्थन करता है, जब तक यह एक भी है मूल्य JSON दस्तावेज़, जिस स्थिति में YAML अभी भी व्हाइटस्पेस के साथ पैडिंग की अनुमति देता है।

एक YAML पार्सर क्योंकि एक JSON दस्तावेज़ में टैब के फेंकता है, तो यह एक मान्य पार्सर है।

कहा जा रहा है, अपने उदाहरण क्योंकि एक ब्लॉक शैली मानचित्रण मूल्य हमेशा अगर यह मानचित्रण नाम के रूप में एक ही लाइन पर नहीं है इंडेंट किया जाना चाहिए विफल हो रहा है।

root: { 
··key: value 
} 

not valid,

root: 
··{ 
····key: value 
··} 

valid है तथापि, और

root: { key: value } 

भी valid है।

2

specification टैब के अनुसार की अनुमति नहीं थी। इसलिए, जब जेएएनएन का उपयोग वाईएएमएल के अंदर किया जाता है, तो यह टैब की इजाजत नहीं देता है।

समस्या तब होती है जब हम जेएसओएन को वाईएएमएल के शुद्ध उप-समूह के रूप में सोचते हैं। लेकिन यह विनिर्देशन में Relation to JSON अनुभाग के अनुसार नहीं है, कुछ छोटी चीजें हैं, जो जेसन को वाईएएमएल का शुद्ध सबसेट होने से रोकती हैं।

यदि हम उन असमानताओं को दूर करना चाहते हैं, तो हमें जो कुछ चाहिए, वह वाईएसओएन जैसा कुछ है, जिसका उल्लेख भी है।

लेकिन सौभाग्य से कुछ वाईएएमएल इंजन हैं जो टैब को इंडेंटेशन के रूप में समर्थन देते हैं। Snakeyml इसके लिए एक उदाहरण है।

7

मुझे पता है कि वाईएएमएल ऐतिहासिक रूप से टैब को अस्वीकार क्यों करता है, लेकिन मैं JSON-superset के संदर्भ में इसकी व्याख्या कैसे कर सकता हूं?

शेष विनिर्देशों को ध्यान में रखते हुए, हम केवल यह निष्कर्ष निकाल सकते हैं कि "सुपरसेट" टिप्पणी गलत है। YAML विनिर्देश Relation to JSON section में मौलिक रूप से असंगत है:

YAML इसलिए बेहतर मानव पठनीयता और अधिक पूर्ण जानकारी मॉडल की पेशकश, JSON का एक स्वाभाविक सुपरसेट के रूप में देखा जा सकता है। यह भी अभ्यास में मामला है; प्रत्येक JSON फ़ाइल एक मान्य YAML फ़ाइल भी है। यह जेएसओएन से वाईएएमएल में माइग्रेट करना आसान बनाता है अगर अतिरिक्त सुविधाओं की आवश्यकता होती है।

जेएसओएन के आरएफसी 4627 की आवश्यकता है कि मैपिंग कुंजी केवल "चाहिए" अद्वितीय हो, जबकि वाईएएमएल जोर देकर कहता है कि वे "होना चाहिए"। तकनीकी रूप से, वाईएएमएल जेएसओएन स्पेक का अनुपालन करता है, डुप्लीकेट को एक त्रुटि के रूप में इलाज करने का चयन करता है। प्रैक्टिस में, चूंकि JSON ऐसे डुप्लीकेट्स के अर्थशास्त्र पर चुप है, केवल पोर्टेबल JSON फ़ाइलें अद्वितीय कुंजी वाले हैं, जो इसलिए मान्य वाईएएमएल फाइलें हैं।

YAML एक "JSON के प्राकृतिक superset" के रूप में जोर देते हुए और उन्होंने कहा कि "हर JSON फ़ाइल को एक मान्य YAML फ़ाइल है" के बावजूद, कल्पना तुरंत कुंजी विशिष्टता संबंध में कुछ मतभेद नोटों। तर्कसंगत रूप से, spec को यहां इंडेंटेशन के लिए टैब का उपयोग करने के आसपास अंतरों को भी ध्यान में रखना चाहिए।,, जिनमें से

बात हो रही है के रूप में सत्यापनकर्ता गर्भित YAML explicitly prohibits tabs as indentation characters:

पोर्टेबिलिटी को बनाए रखने के लिए, टैब वर्ण खरोज में इस्तेमाल नहीं किया जाना चाहिए, के बाद से विभिन्न प्रणालियों को अलग ढंग से टैब का इलाज। ध्यान दें कि अधिकांश आधुनिक संपादकों को कॉन्फ़िगर किया जा सकता है ताकि टैब कुंजी दबाकर रिक्त स्थान की उचित संख्या को सम्मिलित किया जा सके।

यह वह जगह है, जाहिर है, JSON specification, जो केवल राज्यों तुलना में अधिक कड़ाई:

व्हाइटस्पेस टोकन के किसी भी जोड़ी के बीच डाला जा सकता है।

तो, सीधे आपके सवालों के जवाब ...

(जैसे YAML न कि वास्तविक सुपरसेट है या JSON भी टैब नामंज़ूर है? या कल्पना इस मामले लेकिन कार्यान्वयन में टैब के लिए अनुमति नहीं है वहाँ अभी तक नहीं

... YAML वास्तव में एक सुपरसेट नहीं है JSON नहीं नामंज़ूर टैब, जबकि YAML विनिर्देश वास्तव में स्पष्ट टैब नामंज़ूर करता करता है?),।

+0

मेरा मानना ​​है कि आप टैब पात्रों के बारे में सही नहीं हैं, और मैंने देखा है कुछ ऑनलाइन पारसर्स एक ही गलती करते हैं। [कल्पना] (http://yaml-online-parser.appspot.com/) _does_ टैब वर्णों की अनुमति: "बाहर खरोज और अदिश सामग्री, YAML एक लाइन के भीतर टोकन के बीच अलगाव के लिए सफेद स्थान वर्णों का उपयोग करता नोट इस तरह के सफेद स्थान है। सुरक्षित रूप से टैब वर्ण शामिल हो सकता है। " –

+0

इसके अलावा, [कल्पना] (http://www.yaml.org/spec/1.2/spec.html#id2778481) की अनुमति देता है प्रवाह लाइनों के लिए लाइन उपसर्ग पदों में टैब: "प्रवाह अदिश शैलियों के लिए यह अतिरिक्त सभी प्रमुख सफेद स्थान शामिल हैं , जिसमें टैब वर्ण हो सकते हैं। " यह किसी भी जेएसओएन को सही वाईएएमएल पार्सर के साथ संगत करेगा, सिवाय इसके कि JSON spec इसे कार्यान्वयनकर्ता तक छोड़ देता है (जैसा कि आरएफसी 4627 के बारे में टिप्पणी द्वारा इंगित किया गया है)। –

+2

@ ब्रैंडनबॉन्ड जो दिलचस्प है। सबसे अच्छा, तो, ऐसा लगता है कि वाईएएमएल विनिर्देश स्वयं के साथ असंगत है। मुझे यकीन है कि शब्दाडंबर के साथ बयान में सामंजस्य करने के लिए कैसे की तरह "सामान्य तौर पर, खरोज एक लाइन के शुरू में एक शून्य या अधिक रिक्ति के रूप में परिभाषित किया गया है" और "पोर्टेबिलिटी को बनाए रखने के लिए, टैब वर्ण खरोज में नहीं किया जाना चाहिए", नहीं कर रहा हूँ आप एक ही विनिर्देश से संबंधित उनके बावजूद संदर्भित हैं। – jmar777

संबंधित मुद्दे