2012-01-11 13 views
8

मुझे जेसन को लिखने वाले सॉफ़्टवेयर के लिए कॉन्फ़िगरेशन फ़ाइलों के प्रारूप के रूप में पसंद है। मुझे लगता है कि यह हल्का, सरल, और व्यापक रूप से समर्थित है। हालांकि, मुझे लगता है कि कुछ चीजें हैं जिन्हें मैं वास्तव में जेसन में पसंद करूंगा कि इसमें नहीं है।JSON विकल्प (कॉन्फ़िगरेशन निर्दिष्ट करने के उद्देश्य से)?

जेसन में मल्टीलाइन तार या यहां दस्तावेज़ (http://en.wikipedia.org/wiki/Here_document) नहीं हैं, और यह अक्सर बहुत अजीब होता है जब आप अपनी जेसन फ़ाइल को मानव-पठनीय और संपादन योग्य होना चाहते हैं। आप तारों के सरणी का उपयोग कर सकते हैं, लेकिन यह एक कट्टरपंथी कामकाज है।

जेसन टिप्पणियों की अनुमति नहीं देता है।

यदि आप यूनिक्स कॉन्फ़िगरेशन फ़ाइलों के स्वरूपों को देखते हैं, तो आप बहुत से लोगों को अपने स्वयं के अजीब प्रारूपों को डिजाइन करने के लिए देखते हैं जो कि किसी प्रकार की सामान्य उद्देश्य वाली चीज़ का उपयोग करने के लिए वास्तव में अधिक समझ में आते हैं। उदाहरण के लिए, यहाँ एक अपाचे config फ़ाइल से कुछ कोड है:

RewriteEngine on 
RewriteBase /temp 
RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml 
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml\s*;\s*q=0 
RewriteCond %{REQUEST_URI} \.html 
RewriteCond %{THE_REQUEST} HTTP/1\.1 
RewriteRule t\.html t.xhtml [T=application/xhtml+xml] 

अनिवार्य रूप से, यहाँ क्या हो रहा है वे एक बूलियन समारोह च लेखन की एक अत्यंत दर्दनाक तरीके का आविष्कार किया है कि है (डब्ल्यू, एक्स, वाई, जेड) = डब्ल्यू &! एक्स & वाई & जेड। आप एक तार्किक "या" चाहते हैं? उनके लिए कुछ अलग (बदसूरत) तंत्र भी मिला है।

ऐसा लगता है कि यह कुछ प्रकार की डेटा विवरण भाषा है जो सरल और ट्यूरिंग-अपूर्ण है, लेकिन अभी भी अधिक अभिव्यक्तिपूर्ण, लचीला और जेसन से सुविधाजनक है। क्या किसी को ऐसी भाषा पता है?

मेरे स्वाद के लिए, एक्सएमएल बहुत जटिल है, और लिस्पी अभिव्यक्तियों में गलत विशेषताएं हैं (ट्यूरिंग-पूर्णता) और सही सुविधाओं (यहां दस्तावेज़, अभिव्यक्तित्मक वाक्यविन्यास) की कमी है।

[संपादित करें] शीर्षक भ्रामक है। मैं जेसन के अगले पुनरावृत्ति में सचमुच दिलचस्पी नहीं रखता हूं। मुझे उन भाषाओं में दिलचस्पी नहीं है जो जावास्क्रिप्ट का उप-समूह हैं। मुझे वैकल्पिक डेटा-विवरण भाषाओं में दिलचस्पी है।

+3

[YAML] (http://en.wikipedia.org/wiki/YAML):

यहाँ उदाहरण टुकड़ा है? – BalusC

+0

@ बालससी: दिलचस्प सुझाव :-) लेकिन वाईएएमएल बुलियन फ़ंक्शन/अपाचे उदाहरण, या इसी तरह के स्वाद के अनुप्रयोगों का कोई अच्छा तरीका नहीं प्रतीत होता है। –

उत्तर

1

जेएसओएन में 'जे' "जावास्क्रिप्ट" है। यदि जावास्क्रिप्ट में कोई विशेष वांछित वाक्यविन्यास निर्माण नहीं है, तो यह JSON पर नहीं होगा।

हेरेडॉक्स जेएसओएन के अधिकार से परे हैं। सरलीकृत बहु-पंक्ति स्ट्रिंग परिभाषा के लिए यह एक भाषा वाक्यविन्यास निर्माण है, लेकिन जेएसओएन एक परिवहन नोटेशन है। इसका निर्माण के साथ कुछ लेना देना नहीं है। हालांकि, इसमें स्ट्रिंग के भीतर \n न्यूलाइन वर्णों की इजाजत देकर मल्टीलाइन स्ट्रिंग्स हैं। जेएसओएन में कुछ भी नहीं है जो कहता है कि आपको स्ट्रिंग में लाइनबैक नहीं हो सकता है। जब तक युक्त उद्धरण वर्ण सही होते हैं, यह पूरी तरह से मान्य है। जैसे

{"x":"y\nz"} 

100% वैध मान्य JSON है, और एक बहु स्ट्रिंग है, जबकि

{"x":"y 
z"} 

नहीं है और पार्स पर असफल हो जायेगी।

+0

"यदि जावास्क्रिप्ट में कोई विशेष वांछित वाक्यविन्यास निर्माण नहीं है, तो यह JSON पर नहीं होगा।" यह प्यारा है, लेकिन JSON वास्तव में जावास्क्रिप्ट का सबसेट नहीं है, और जावास्क्रिप्ट नहीं करता है कि चीजों का समर्थन करता है। – kyrias

2

हमेशा "असली JSON" को कॉल करना पसंद है। JSON जावास्क्रिप्ट ऑब्जेक्ट नोटेशन के लिए खड़ा है, और जावास्क्रिप्ट में टिप्पणियां हैं और हेड्रॉक्स के लिए पर्याप्त कुछ है।

हियरडॉक के लिए, आप जावास्क्रिप्ट की E4X इनलाइन एक्सएमएल का प्रयोग करेंगे:

{ 
    longString: <> 
       Hello, world! 
       This is a long string made possible with the magic of E4X. 
       Implementing a parser isn't so difficult. 
       </>.toString() // And a comment 
    /* And another 
     comment */ 
} 

आप Firefox के JavaScript इंजन का उपयोग कर सकते (केवल FF ब्राउज़र वर्तमान में E4X का समर्थन है) या आप अपने स्वयं पार्सर, जो वास्तव में लागू कर सकते हैं इतना मुश्किल नहीं है।

Here's the E4X quickstart guide, too.

+0

दिलचस्प विचार, हालांकि यह ट्यूरिंग-अपूर्णता के मानदंड में विफल रहता है। –

+0

नेटवर्क बैंडविड्थ को बचाने के लिए व्हाइटस्पेस को संपीड़ित करने के तरीके/एस क्या हैं? धन्यवाद। –

+1

@AizzatSuhardi: वास्तविक JSON JSON – Ryan

0

एक JSON (शायद सबसे महत्वपूर्ण) की महत्वपूर्ण विशेषता है सकते हैं कि आप आसानी से स्ट्रिंग प्रतिनिधित्व और वस्तु के रूप में प्रतिनिधित्व, और वस्तु प्रपत्र का प्रतिनिधित्व करते थे वस्तुओं के बीच "फ्लिप" अपेक्षाकृत हैं सरल सरणी और नक्शे। यह जेएसओएन को नेटवर्किंग संदर्भ में इतना उपयोगी बनाता है।

जो कार्य आप चाहते हैं वह JSON की इस दोहरी प्रकृति के साथ संघर्ष करेगा।

4

EDN format क्लोजर अक्षरों पर आधारित एक विकल्प है। यह जेएसओएन का लगभग एक सुपरसेट है, सिवाय इसके कि कोई विशेष प्रतीक नक्शे में चाबियाँ और मूल्यों को अलग नहीं करता है (जैसा कि : JSON में करता है); बल्कि, सभी तत्वों को व्हाइटस्पेस और/या अल्पविराम से अलग किया जाता है और {..} में संलग्न तत्वों की संख्या के साथ एक मानचित्र को एक सूची के रूप में एन्कोड किया जाता है।

ईडीएन टिप्पणियों की अनुमति देता है (; का उपयोग करके नई लाइन पर, या #_ का उपयोग करके अगले तत्व के पढ़ने के लिए), लेकिन यहां दस्तावेज़ नहीं। यह एक टैग अंकन का उपयोग नए प्रकार के लिए एक्स्टेंसिबल है:

#myapp/Person {:first "Fred" :last "Mertz"} 

myapp/Person टैग के तर्क (अर्थात {:first "Fred" :last "Mertz"}) एक वैध EDN अभिव्यक्ति है, जो इसे यहाँ-डॉक समर्थन करने के लिए unextensible बनाता है होना चाहिए।

इसमें दो अंतर्निहित टैग हैं: #inst टाइमस्टैम्प और #uuid के लिए। यह नेमस्पेस्ड प्रतीक (यानी पहचानकर्ता) और कीवर्ड (यानी मैप कुंजी कॉन्स्ट) प्रकारों का भी समर्थन करता है; यह सूचियों (..) और वेक्टर [..] सूची को अलग करता है। किसी भी प्रकार का तत्व मानचित्र में एक कुंजी के रूप में उपयोग किया जा सकता है।

आपकी उपरोक्त समस्या के संदर्भ में, कोई #apache/rule-or टैग का आविष्कार कर सकता है जो तत्वों के अनुक्रम को स्वीकार करता है, जिनके अर्थशास्त्र मैं आपको छोड़ देता हूं!

0

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

4

http://igagis.github.io/stob/

पर एक नज़र डालें यह JSON से भी सरल है।

इसमें सी ++ शैली टिप्पणियां हैं।

मल्टीलाइन तारों को प्रारूपित करना और नई लाइन \ n और टैब \ t वर्णों का उपयोग करना संभव है यदि "असली" नई पंक्ति या टैब की आवश्यकता हो।

"String object" 
AnotherStringObject 
"String with children"{ 
    "child 1" 
    Child2 
    "child three"{ 
     SubChild1 
     "Subchild two" 

     Property1 {Value1} 
     "Property two" {"Value 2"} 
     //comment 

     /* multi-line 
      comment */ 

     "multi-line 
     string" 

     "Escape sequences \" \n \r \t \\" 
    } 

R"qwerty(
This is a 
raw string, "Hello world!" 
int main(argc, argv){ 
    int a = 10; 
    printf("Hello %d", a); 
} 
)qwerty" 
} 
+0

यह पहली नजर में प्यार है। यहां तक ​​कि कच्ची स्ट्रिंग शाब्दिक भयानक – Abdurrahim

+0

भी है कि आपको यह पसंद आया। दुर्भाग्यवश, कच्चे स्ट्रिंग समर्थन को केवल C++ लाइब्रेरी में लागू किया गया है। सी # और जावा libs इस समय कच्चे तार समर्थन की कमी है। – igagis

+0

मान लें कि ओएस विकास को सहयोग करने का समय है। विशेष रूप से सी # लाइब्रेरी में सुधार की आवश्यकता है जैसे सी ++ डेवलपर ने लिखा है :) – Abdurrahim

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