क्या JSON में टिप्पणी का उपयोग किया जा सकता है?




comments (20)

अस्वीकरण: आपकी वारंटी समाप्त हो गई है

जैसा कि बताया गया है, यह हैक स्पेक के कार्यान्वयन का लाभ उठाता है। सभी JSON पार्सर्स इस तरह के JSON को समझ नहीं पाएंगे। विशेष रूप से स्ट्रीमिंग पार्सर्स चकित होंगे।

यह एक दिलचस्प जिज्ञासा है, लेकिन आपको वास्तव में इसका उपयोग किसी भी चीज़ के लिए नहीं करना चाहिए । नीचे मूल जवाब है।

मुझे एक छोटा हैक मिला है जो आपको एक JSON फ़ाइल में टिप्पणियां रखने की अनुमति देता है जो पार्सिंग को प्रभावित नहीं करेगा, या डेटा को किसी भी तरह से प्रदर्शित नहीं करेगा।

ऐसा प्रतीत होता है कि ऑब्जेक्ट को शाब्दिक घोषित करते समय आप एक ही कुंजी के साथ दो मान निर्दिष्ट कर सकते हैं, और अंतिम व्यक्ति को प्राथमिकता मिलती है। मानो या नहीं, यह पता चला है कि JSON पार्सर्स एक ही तरीके से काम करते हैं। तो हम स्रोत JSON में टिप्पणियां बनाने के लिए इसका उपयोग कर सकते हैं जो एक पार्स ऑब्जेक्ट प्रस्तुति में मौजूद नहीं होगा।

({a: 1, a: 2});
// => Object {a: 2}
Object.keys(JSON.parse('{"a": 1, "a": 2}')).length; 
// => 1

यदि हम इस तकनीक को लागू करते हैं, तो आपकी टिप्पणी की गई JSON फ़ाइल इस तरह दिखाई दे सकती है:

{
  "api_host" : "The hostname of your API server. You may also specify the port.",
  "api_host" : "hodorhodor.com",

  "retry_interval" : "The interval in seconds between retrying failed API calls",
  "retry_interval" : 10,

  "auth_token" : "The authentication token. It is available in your developer dashboard under 'Settings'",
  "auth_token" : "5ad0eb93697215bc0d48a7b69aa6fb8b",

  "favorite_numbers": "An array containing my all-time favorite numbers",
  "favorite_numbers": [19, 13, 53]
}

उपरोक्त कोड मान्य JSON है । यदि आप इसे पार्स करते हैं, तो आपको इस तरह की वस्तु मिल जाएगी:

{
    "api_host": "hodorhodor.com",
    "retry_interval": 10,
    "auth_token": "5ad0eb93697215bc0d48a7b69aa6fb8b",
    "favorite_numbers": [19,13,53]
}

जिसका अर्थ है कि टिप्पणियों का कोई निशान नहीं है, और उनके पास अजीब दुष्प्रभाव नहीं होंगे।

हैप्पी हैकिंग!

क्या मैं JSON फ़ाइल के अंदर टिप्पणियों का उपयोग कर सकता हूं? यदि हां, तो कैसे?


आप नहीं कर सकते कम से कम यह JSON.org पर एक त्वरित नज़र से मेरा अनुभव है।

जेएसओएन ने उस पृष्ठ पर इसका वाक्यविन्यास देखा है। टिप्पणियों के बारे में कोई टिप्पणी नहीं है।


क्षमा करें, हम JSON में टिप्पणियों का उपयोग नहीं कर सकते ... JSON.org पर JSON के लिए सिंटैक्स आरेख देखें।

डगलस क्रॉकफोर्ड कहते हैं, " plus.google.com/118095276221607585885/posts/RK8qyGVaGSr ":

मैंने JSON से टिप्पणियां हटा दी क्योंकि मैंने देखा कि लोग पार्सिंग निर्देशों को पकड़ने के लिए उनका उपयोग कर रहे थे, एक ऐसा अभ्यास जो अंतःक्रियाशीलता को नष्ट कर देता। मुझे पता है कि टिप्पणियों की कमी कुछ लोगों को दुखी करती है, लेकिन यह नहीं होना चाहिए।

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


जेएसओएन के पीछे विचार अनुप्रयोगों के बीच सरल डेटा एक्सचेंज प्रदान करना है। ये आम तौर पर वेब आधारित होते हैं और भाषा जावास्क्रिप्ट होती है।

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

जो कुछ भी कहा गया, यह इरादा नहीं है कि JSON फ़ाइल में पारंपरिक अर्थों में टिप्पणियां होनी चाहिए। यह सिर्फ डेटा होना चाहिए।

अधिक जानकारी के लिए JSON वेबसाइट पर एक नज़र डालें।


जेएसओएन से डिज़ाइन द्वारा टिप्पणियां हटा दी गईं।

मैंने JSON से टिप्पणियां हटा दी क्योंकि मैंने देखा कि लोग पार्सिंग निर्देशों को पकड़ने के लिए उनका उपयोग कर रहे थे, एक ऐसा अभ्यास जो अंतःक्रियाशीलता को नष्ट कर देता। मुझे पता है कि टिप्पणियों की कमी कुछ लोगों को दुखी करती है, लेकिन यह नहीं होना चाहिए।

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

स्रोत: plus.google.com/118095276221607585885/posts/RK8qyGVaGSr


टिप्पणियाँ एक आधिकारिक मानक नहीं हैं। हालांकि कुछ पार्सर्स सी-स्टाइल टिप्पणियों का समर्थन करते हैं। एक जो मैं उपयोग करता हूं वह JsonCpp । उदाहरणों में यह एक है:

// Configuration options
{
    // Default encoding for text
    "encoding" : "UTF-8",

    // Plug-ins loaded at start-up
    "plug-ins" : [
        "python",
        "c++",
        "ruby"
        ],

    // Tab indent size
    "indent" : { "length" : 3, "use_space": true }
}

jsonlint यह मान्य नहीं करता है। तो टिप्पणियां एक पार्सर विशिष्ट एक्सटेंशन हैं और मानक नहीं हैं।

एक और पार्सर JSON5

JSON TOML एक विकल्प।


मैं बस विन्यास फाइलों के लिए इसका सामना कर रहा हूँ। मैं एक्सएमएल (वर्बोज़, ग्राफिकल, बदसूरत, पढ़ने में कठोर), या "आईएनआई" प्रारूप (कोई पदानुक्रम, कोई असली मानक इत्यादि) या जावा "गुण" प्रारूप (जैसे .ini) का उपयोग नहीं करना चाहता हूं।

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

मुझे लगता है कि कोई "वैध" JSON के लिए " "#": "comment" उपयोग कर सकता है।


यदि आप Jackson को अपने JSON पार्सर के रूप में उपयोग कर रहे हैं तो इस तरह आप इसे टिप्पणियों की अनुमति देने में सक्षम करते हैं:

ObjectMapper mapper = new ObjectMapper().configure(Feature.ALLOW_COMMENTS, true);

फिर आप इस तरह की टिप्पणियां कर सकते हैं:

{
  key: "value" // Comment
}

और आप सेटिंग के साथ # से शुरू होने वाली टिप्पणी भी कर सकते हैं:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

लेकिन सामान्य रूप से (जैसा कि पहले उत्तर दिया गया है) विनिर्देश टिप्पणियों की अनुमति नहीं देता है।


यदि आपकी टेक्स्ट फ़ाइल, जो एक JSON स्ट्रिंग है, को कुछ प्रोग्राम द्वारा पढ़ा जा रहा है, तो इसका उपयोग करने से पहले सी या सी ++ स्टाइल टिप्पणियों को बाहर करना कितना मुश्किल होगा?

उत्तर: यह एक लाइनर होगा। यदि आप ऐसा करते हैं तो JSON फ़ाइलों को कॉन्फ़िगरेशन फ़ाइलों के रूप में उपयोग किया जा सकता है।


वाईएएमएल का उपयोग करने पर विचार करें। यह JSON का लगभग एक सुपरसेट है (वस्तुतः सभी मान्य JSON वैध YAML है) और यह टिप्पणियों की अनुमति देता है।


JSON एक फ़्रेमयुक्त प्रोटोकॉल नहीं है । यह एक भाषा मुक्त प्रारूप है । तो JSON के लिए एक टिप्पणी का प्रारूप परिभाषित नहीं किया गया है।

जैसा कि कई लोगों ने सुझाव दिया है, कुछ चाल हैं, उदाहरण के लिए, डुप्लिकेट कुंजी या एक विशिष्ट कुंजी _commentजिसका आप उपयोग कर सकते हैं। यह आप पर निर्भर करता है।


नहीं , जेएसओएन में फॉर्म //… या /*…*/ की अनुमति नहीं है। यह उत्तर इस पर आधारित है:

  • http://www.json.org
  • आरएफसी 4627 : जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (जेएसओएन) के लिए application/json मीडिया टाइप
  • आरएफसी 715 9 जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (जेएसओएन) डेटा इंटरचेंज प्रारूप - Obsoletes: 4627, 7158

JSON कॉन्फ़िगरेशन फ़ाइलों और अन्य स्थानीय उपयोग के लिए बहुत अधिक समझ में आता है क्योंकि यह सर्वव्यापी है और क्योंकि यह XML से बहुत आसान है।

यदि डेटा संचार (चाहे वैध या नहीं) संचार करते समय JSON में टिप्पणियां करने के खिलाफ लोगों के पास मजबूत कारण हैं, तो संभावित रूप से JSON को दो में विभाजित किया जा सकता है:

  • जेएसओएन-कॉम: जेएसओएन तार पर जेएसओएन, या जेएसओएन डेटा संचार करते समय लागू नियम।
  • JSON-DOC: JSON दस्तावेज़, या JSON फ़ाइलों या स्थानीय रूप से। नियम जो वैध JSON दस्तावेज़ को परिभाषित करते हैं।

जेएसओएन-डीओसी टिप्पणियों की अनुमति देगा, और अन्य मामूली मतभेद मौजूद हो सकते हैं जैसे व्हाइटस्पेस को संभालना। पार्सर्स आसानी से एक स्पेक से दूसरे में परिवर्तित कर सकते हैं।

इस मुद्दे पर डगलस क्रॉकफ़ोर्ड द्वारा की गई plus.google.com/118095276221607585885/posts/RK8qyGVaGSr संबंध में (@Artur Czajka द्वारा संदर्भित)

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

हम एक सामान्य कॉन्फ़िगरेशन फ़ाइल समस्या (क्रॉस भाषा / प्लेटफॉर्म) के बारे में बात कर रहे हैं, और वह जेएस विशिष्ट उपयोगिता के साथ जवाब दे रहा है!

निश्चित रूप से किसी भी भाषा में एक JSON विशिष्ट minify लागू किया जा सकता है, लेकिन इसे मानकीकृत करें ताकि यह सभी भाषाओं और प्लेटफार्मों में पार्सर्स में सर्वव्यापी हो जाए, इसलिए लोग इस सुविधा की कमी के समय बर्बाद कर देते हैं क्योंकि उनके पास अच्छे उपयोग-मामले हैं, इस मुद्दे को देखते हुए ऑनलाइन मंच, और लोगों को यह बताते हुए कि यह एक बुरा विचार है या सुझाव है कि पाठ फ़ाइलों से अलग टिप्पणियों को लागू करना आसान है।

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


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

JSON की टिप्पणियां नहीं हैं। एक JSON एन्कोडर टिप्पणियों को आउटपुट नहीं करना चाहिए। एक JSON डिकोडर मई स्वीकार और अनदेखा कर सकता है।

टिप्पणियों का अर्थ कभी भी सार्थक संचारित करने के लिए नहीं किया जाना चाहिए। जेएसओएन के लिए यही है।

सीएफ: जेएसओएन स्पेक के लेखक डगलस क्रॉकफोर्ड


Dojo Toolkit जावास्क्रिप्ट टूलकिट (कम से कम संस्करण 1.4 के रूप में), आपको अपने JSON में टिप्पणियां शामिल करने की अनुमति देता है। टिप्पणियां /* */प्रारूप का हो सकती हैं । डोजो टूलकिट dojo.xhrGet()कॉल के माध्यम से जेएसओएन का उपभोग करता है ।

अन्य जावास्क्रिप्ट टूलकिट समान रूप से काम कर सकते हैं।

अंतिम विकल्प चुनने से पहले वैकल्पिक डेटा संरचनाओं (या यहां तक ​​कि डेटा सूचियों) के साथ प्रयोग करते समय यह सहायक हो सकता है।


आप JSONP में टिप्पणी कर सकते हैं , लेकिन शुद्ध JSON में नहीं। मैंने अपने कार्यक्रम को हाईचार्ट्स से इस उदाहरण के साथ काम करने का प्रयास करने में एक घंटा बिताया है: http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?JSONPhttp://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?

यदि आप लिंक का पालन करते हैं, तो आप देखेंगे

?(/* AAPL historical OHLC data from the Google Finance API */
[
/* May 2006 */
[1147651200000,67.79],
[1147737600000,64.98],
...
[1368057600000,456.77],
[1368144000000,452.97]
]);

चूंकि मेरे पास मेरे स्थानीय फ़ोल्डर में एक समान फ़ाइल थी, वही मूल नीति के साथ कोई समस्या नहीं थी , इसलिए मैंने शुद्ध JSON का उपयोग करने का निर्णय लिया ... और, ज़ाहिर है, $.getJSONटिप्पणियों के कारण चुपचाप विफल रहा था।

आखिर में मैंने उपरोक्त पते पर मैन्युअल HTTP अनुरोध भेजा और महसूस किया कि सामग्री-प्रकार तब text/javascriptसे था , जेएसओएनपी शुद्ध जावास्क्रिप्ट लौटाता है। इस मामले में टिप्पणियों की अनुमति है । लेकिन मेरे आवेदन ने सामग्री-प्रकार वापस कर दिया application/json, इसलिए मुझे टिप्पणियां हटाना पड़ा।


एक अच्छा समाधान (हैक) है, जो वैध JSON है। बस एक ही कुंजी दो बार (या अधिक) बनाओ। उदाहरण के लिए:

{
  "param" : "This is the comment place",
  "param" : "This is value place",
}

तो जेएसओएन इसे इस तरह समझ जाएगा:

{
  "param" : "This is value place",
}

जेएसओएन के लेखक चाहते हैं कि हम JSON में टिप्पणियां शामिल करें, लेकिन उन्हें पार्स करने से पहले उन्हें बाहर निकालें ( माइकल बुर द्वारा प्रदान किए गए plus.google.com/118095276221607585885/posts/RK8qyGVaGSr देखें )। अगर जेएसओएन के पास टिप्पणियां होनी चाहिए, तो उन्हें मानकीकृत क्यों न करें, और जेएसओएन पार्सर नौकरी करें? मैं वहां तर्क से सहमत नहीं हूं, लेकिन, हां, यह मानक है। दूसरों द्वारा सुझाए गए वाईएएमएल समाधान का उपयोग करना अच्छा है, लेकिन इसके लिए लाइब्रेरी निर्भरता की आवश्यकता होती है।

यदि आप टिप्पणियां बंद करना चाहते हैं, लेकिन लाइब्रेरी निर्भरता नहीं चाहते हैं, तो यहां दो-लाइन समाधान है, जो सी ++ - स्टाइल टिप्पणियों के लिए काम करता है, लेकिन इसे दूसरों के लिए अनुकूलित किया जा सकता है:

var comments = new RegExp("//.*", 'mg');
data = JSON.parse(fs.readFileSync(sample_file, 'utf8').replace(comments, ''));

ध्यान दें कि इस समाधान का केवल उन मामलों में उपयोग किया जा सकता है जहां आप यह सुनिश्चित कर सकते हैं कि JSON डेटा में टिप्पणी आरंभकर्ता नहीं है, उदाहरण के लिए ('//')।

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

data = require(fs.realpathSync(doctree_fp));

यह आपके JSON लाइब्रेरी पर निर्भर करता है। Json.NET जावास्क्रिप्ट-शैली टिप्पणियों का समर्थन करता है /* commment */,।

एक और स्टैक ओवरफ़्लो प्रश्न देखें ।


यह एक "आप कर सकते हैं" सवाल है। और यहां एक "हां" जवाब है।

नहीं, आपको एक साइड चैनल डेटा को जेएसओएन एन्कोडिंग में डुप्लिकेटिव ऑब्जेक्ट सदस्यों का उपयोग नहीं करना चाहिए। ( आरएफसी में "ऑब्जेक्ट के भीतर नाम अद्वितीय होना चाहिए" देखें )।

और हाँ, आप जेएसओएन के आसपास टिप्पणियां डाल सकते हैं , जिसे आप पार्स कर सकते हैं।

लेकिन यदि आप एक वैध JSON को मनमाने ढंग से साइड-चैनल डेटा डालने और निकालने का तरीका चाहते हैं, तो यहां एक उत्तर है। हम JSON एन्कोडिंग में डेटा के गैर-अद्वितीय प्रतिनिधित्व का लाभ उठाते हैं। यह अनुमति दी है * तहत आरएफसी की धारा दो में "खाली स्थान के पहले या छह संरचनात्मक वर्णों के किसी भी के बाद अनुमति दी है"।

* आरएफसी केवल "छः संरचनात्मक पात्रों में से पहले या बाद में व्हाइटस्पेस की अनुमति है", स्पष्ट रूप से तारों, संख्याओं, "झूठी", "सत्य" और "शून्य" का उल्लेख नहीं करते हैं। सभी कार्यान्वयन में इस चूक को नजरअंदाज कर दिया गया है।

सबसे पहले, इसे छोटा करके अपने JSON को कैननिकलाइज़ करें:

$jsonMin = json_encode(json_decode($json));

फिर बाइनरी में अपनी टिप्पणी एन्कोड करें:

$hex = unpack('H*', $comment);
$commentBinary = base_convert($hex[1], 16, 2);

फिर अपनी बाइनरी चुराओ:

$steg = str_replace('0', ' ', $commentBinary);
$steg = str_replace('1', "\t", $steg);

आपका आउटपुट यहां है:

$jsonWithComment = $steg . $jsonMin;




comments