هل يمكن استخدام التعليقات في JSON؟




comments (20)

هل يمكنني استخدام التعليقات داخل ملف JSON؟ إذا كان الأمر كذلك ، كيف؟

https://code.i-harness.com


JSON لا يدعم التعليقات. كما أنه لم يقصد استخدامه مطلقًا في ملفات التكوين حيث ستكون هناك حاجة للتعليقات.

Hjson هو تنسيق ملف التكوين للبشر. بناء الجملة استرخاء ، وأخطاء أقل ، المزيد من التعليقات.

يمكنك الاطلاع على hjson.org في مكتبات JavaScript و Java و Python و PHP و Rust و Go و Ruby و C #.


أنا مجرد مواجهة هذا لملفات التكوين. لا أريد استخدام XML (مطول أو بياني أو قبيح أو صعب القراءة) أو تنسيق "ini" (لا تسلسل هرمي أو معيار حقيقي ، إلخ) أو تنسيق "خصائص" جافا (مثل .ini).

تستطيع JSON القيام بكل ما يمكنها فعله ، ولكنها طريقة أقل وضوحا وقابلية للقراءة أكثر - والمحللون سهلون ومتواجدين في العديد من اللغات. انها مجرد شجرة البيانات. لكن التعليقات خارج النطاق ضرورية في كثير من الأحيان لتوثيق تكوينات "افتراضية" وما شابه. لا يجب أن تكون التهيئات "مستندات كاملة" أبدًا ، ولكن أشجار البيانات المحفوظة التي يمكن أن تكون مقروءة للإنسان عند الحاجة.

أعتقد أنه يمكن استخدام "#": "comment" ، لـ JSON "صالح".


إذا كان ملف النص الخاص بك ، والذي هو عبارة عن سلسلة JSON ، سيتم قراءته بواسطة بعض البرامج ، فما مدى صعوبة إلغاء تعليقات نمط C أو C ++ قبل استخدامه؟

الجواب: سيكون من بطانة واحدة. إذا قمت بذلك ، فيمكن استخدام ملفات JSON كملفات تهيئة.


إذا كنت تستخدم Jackson كمحلل JSON الخاص بك ، فهذا هو كيفية تمكينه للسماح بالتعليقات:

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

ثم يمكنك الحصول على تعليقات مثل هذا:

{
  key: "value" // Comment
}

ويمكنك أيضًا إضافة تعليقات تبدأ بـ # عن طريق الإعداد:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

ولكن بشكل عام (كما ورد من قبل) فإن المواصفات لا تسمح بالتعليقات.


إليك ما وجدته في وثائق Google Firebase التي تسمح لك بوضع التعليقات في JSON:

{
  "//": "Some browsers will use this to enable push notifications.",
  "//": "It is the same for all projects, this is not your project's sender ID",
  "gcm_sender_id": "1234567890"
}

التعليقات ليست معيارا رسميا. على الرغم من أن بعض المحللين يدعمون C- نمط التعليقات. واحد أستخدمه هو 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 .


تمت إزالة التعليقات من JSON حسب التصميم.

أزلت التعليقات من JSON لأنني رأيت أشخاصًا يستخدمونها لتنفيذ توجيهات إعراب ، وهي ممارسة كان من شأنها أن تدمر قابلية التشغيل البيني. أعلم أن قلة التعليقات تجعل بعض الناس حزينين ، لكن لا ينبغي أن يكون ذلك.

لنفترض أنك تستخدم JSON للاحتفاظ بملفات التهيئة ، التي ترغب في إضافة تعليقات إليها. المضي قدما وإدراج جميع التعليقات التي تريدها. ثم قم بتوصيله عبر JSMin قبل تسليمه إلى محلل JSON الخاص بك.

المصدر: plus.google.com/118095276221607585885/posts/RK8qyGVaGSr


عذرًا ، لا يمكننا استخدام التعليقات في JSON ... راجع الرسم التوضيحي لبناء الجملة لـ JSON على JSON.org .

يقول Douglas Crockford " plus.google.com/118095276221607585885/posts/RK8qyGVaGSr ":

أزلت التعليقات من JSON لأنني رأيت أشخاصًا يستخدمونها لتنفيذ توجيهات إعراب ، وهي ممارسة كان من شأنها أن تدمر قابلية التشغيل البيني. أعلم أن قلة التعليقات تجعل بعض الناس حزينين ، لكن لا ينبغي أن يكون ذلك.

لنفترض أنك تستخدم JSON للاحتفاظ بملفات التهيئة ، التي ترغب في إضافة تعليقات إليها. المضي قدما وإدراج جميع التعليقات التي تريدها. ثم قم بتوصيله عبر JSMin قبل تسليمه إلى محلل JSON الخاص بك.


لا تستطيع على الأقل هذا خبرتي من نظرة سريعة على JSON.org .

JSON لديه تصور له النحو في تلك الصفحة. ليس هناك أي ملاحظة حول التعليقات.


لا.

يجب أن تكون JSON جميع البيانات ، وإذا قمت بتضمين تعليق ، فستكون البيانات أيضًا.

يمكن أن يكون لديك عنصر بيانات محدد يسمى "_comment" (أو شيء ما) يمكن تجاهله بواسطة التطبيقات التي تستخدم بيانات JSON.

ربما يكون من الأفضل أن يكون لديك تعليق في العمليات التي تولد / تستقبل JSON ، حيث من المفترض أن يعرفوا بيانات JSON مسبقًا ، أو على الأقل هيكلها.

لكن إذا قررت:

{
   "_comment": "comment text goes here...",
   "glossary": {
      "title": "example glossary",
      "GlossDiv": {
         "title": "S",
         "GlossList": {
            "GlossEntry": {
               "ID": "SGML",
               "SortAs": "SGML",
               "GlossTerm": "Standard Generalized Markup Language",
               "Acronym": "SGML",
               "Abbrev": "ISO 8879:1986",
               "GlossDef": {
                  "para": "A meta-markup language, used to create markup languages such as DocBook.",
                  "GlossSeeAlso": ["GML", "XML"]
               },
               "GlossSee": "markup"
            }
         }
      }
   }
}

JSON ليس بروتوكولًا مؤطرًا . إنه تنسيق لغة خالية . لذلك لم يتم تعريف تنسيق التعليقات لـ JSON.

كما اقترح العديد من الأشخاص ، هناك بعض الحيل ، على سبيل المثال ، مفاتيح مكررة أو مفتاح محدد _commentيمكنك استخدامه. الأمر متروك لك.


قم بتضمين التعليقات إذا اخترت؛ اخرجها مع المدقق قبل التحليل أو الإرسال.

لقد قمت للتو بإصدار JSON.minify() الذي JSON.minify() البيضاء من كتلة JSON ويجعلها JSON صالحة ويمكن تحليلها. لذلك ، قد تستخدمها مثل:

JSON.parse(JSON.minify(my_str));

عندما صدر عنها ، حصلت على رد فعل عنيف من الناس الذين يعارضون حتى فكرة ذلك ، لذلك قررت أن أكتب مشاركة مدونة شاملة عن سبب أهمية التعليقات في JSON . يتضمن هذا التعليق الملحوظ من منشئ JSON:

لنفترض أنك تستخدم JSON للاحتفاظ بملفات التهيئة ، التي ترغب في إضافة تعليقات إليها. المضي قدما وإدراج جميع التعليقات التي تريدها. ثم قم بتوصيله عبر JSMin قبل تسليمه إلى محلل JSON الخاص بك. - plus.google.com/118095276221607585885/posts/RK8qyGVaGSr

نأمل أن يكون هذا مفيدًا لأولئك الذين لا يوافقون على السبب في أن JSON.minify () قد يكون مفيدًا.


JSON يجعل الكثير من المعنى لملفات التهيئة والاستخدام المحلي الآخر لأنه في كل مكان ولأنه أبسط بكثير من XML.

إذا كان لدى الأشخاص أسباب قوية لعدم وجود تعليقات في JSON عند توصيل البيانات (سواء كانت صحيحة أم لا) ، فحينئذٍ يمكن تقسيم JSON إلى قسمين:

  • JSON-COM: JSON على السلك ، أو القواعد التي تنطبق عند توصيل بيانات JSON.
  • JSON-DOC: مستند JSON أو JSON في ملفات أو محليًا. القواعد التي تحدد وثيقة JSON صالحة.

سيسمح JSON-DOC بالتعليقات ، وقد توجد اختلافات طفيفة أخرى مثل التعامل مع المسافات البيضاء. يمكن للمحللين التحويل بسهولة من أحد المواصفات إلى الآخر.

فيما يتعلق plus.google.com/118095276221607585885/posts/RK8qyGVaGSr التي أدلى بها دوغلاس كروكفورد حول هذه القضايا (المشار إليها بواسطةArtur Czajka)

لنفترض أنك تستخدم JSON للاحتفاظ بملفات التهيئة ، التي ترغب في إضافة تعليقات إليها. المضي قدما وإدراج جميع التعليقات التي تريدها. ثم قم بتوصيله عبر JSMin قبل تسليمه إلى محلل JSON الخاص بك.

نحن نتحدث عن مشكلة عامة في ملف التهيئة (اللغة المتقاطعة / المنصة) ، وهو يرد باستخدام أداة JS محددة!

بالتأكيد يمكن تنفيذ تعديل محدد JSON بأي لغة ، ولكن توحيد هذا بحيث يصبح في كل مكان عبر موزعي جميع اللغات والمنصات بحيث يتوقف الناس عن إضاعة وقتهم يفتقر إلى الميزة لأن لديهم حالات استخدام جيدة لها ، وتبحث عن المشكلة في المنتديات عبر الإنترنت ، والحصول على أشخاص يخبرونهم أنها فكرة سيئة أو تشير إلى أنه من السهل تنفيذ تعليقات تجريد من الملفات النصية.

القضية الأخرى هي التشغيل المتداخل. لنفترض أن لديك مكتبة أو واجهة برمجة تطبيقات أو أي نوع فرعي يحتوي على بعض ملفات التهيئة أو البيانات المرتبطة به. ويتم الوصول إلى هذا النظام الفرعي من لغات مختلفة. ثم تذهب عن إخبار الناس: بالمناسبة لا تنسوا إزالة التعليقات من ملفات JSON قبل تمريرها إلى المحلل اللغوي!


لا تدعم JSON التعليقات بشكل أصلي ، ولكن يمكنك إنشاء أداة فك التشفير الخاصة بك أو على الأقل من قبل المعالج لتجريد التعليقات ، فهذا أمر جيد تمامًا (طالما أنك تتجاهل التعليقات ولا تستخدمها لتوجيه كيفية معالجة تطبيقك لبيانات JSON ).

ليس لدى JSON أي تعليقات. يجب ألا يصدر برنامج تشفير JSON تعليقات. قد تقبل أداة فك تشفير JSON التعليقات وتجاهلها.

لا ينبغي أبدا استخدام التعليقات لنقل أي شيء ذي مغزى. هذا هو ما هو JSON.

Cf: دوغلاس كروكفورد ، مؤلف كتاب JSON spec .


إذا كنت تستخدم JSON5 فيمكنك تضمين التعليقات.

JSON5 هو ملحق مقترح لـ JSON يهدف إلى تسهيل عملية الكتابة باليد البشرية والحفاظ عليها. يفعل ذلك عن طريق إضافة بعض ميزات بناء الجملة الحد الأدنى مباشرة من ECMAScript 5.


تسمح لك مجموعة أدوات Dojo Toolkit JavaScript (على الأقل في الإصدار 1.4) بتضمين التعليقات في JSON الخاص بك. يمكن أن تكون التعليقات ذات /* */تنسيق. تستهلك Dojo Toolkit JSON عبر dojo.xhrGet()المكالمة.

قد تعمل مجموعة أدوات جافا سكريبت الأخرى بشكل مشابه.

يمكن أن يكون ذلك مفيدًا عند تجربة هياكل البيانات البديلة (أو حتى قوائم البيانات) قبل اختيار الخيار النهائي.


نحن نستخدم strip-json-commentsلمشروعنا. يدعم شيئًا مثل:

/*
 * Description 
*/
{
    // rainbows
    "unicorn": /* ❤ */ "cake"
}

ببساطة npm install --save strip-json-commentsلتركيب واستخدامها مثل:

var strip_json_comments = require('strip-json-comments')
var json = '{/*rainbows*/"unicorn":"cake"}';
JSON.parse(strip_json_comments(json));
//=> {unicorn: 'cake'}

هذا هو السؤال "هل يمكن" . وهنا جواب "نعم" .

لا ، يجب ألا تستخدم أعضاء الكائنات المكررة في إدخال بيانات القناة الجانبية إلى تشفير JSON. (راجع "يجب أن تكون الأسماء الموجودة داخل كائن فريدة" في RFC ).

ونعم ، يمكنك إدراج تعليقات حول JSON ، والتي يمكنك تحليلها.

ولكن إذا كنت تريد طريقة لإدخال بيانات القناة الجانبية العشوائية واستخلاصها إلى JSON صالح ، فإليك إجابة. نحن نستفيد من التمثيل غير الفريد للبيانات في تشفير JSON. هذا مسموح به * في القسم الثاني من RFC ضمن "المسافة البيضاء مسموح بها قبل أو بعد أي من الأحرف الهيكلية الستة".

* ينص RFC على أنه "يُسمح بالمسافة البيضاء قبل أي من الأحرف الهيكلية الستة أو بعدها" ، بدون الإشارة بوضوح إلى السلاسل والأرقام و "false" و "true" و "null". يتم تجاهل هذا الإغفال في جميع التطبيقات.

أولاً ، قم بتحسين 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;

هناك حل جيد (الاختراق) ، وهو JSON صالح. مجرد جعل نفس المفتاح مرتين (أو أكثر). فمثلا:

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

لذلك ستفهم JSON ذلك على النحو التالي:

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

يريدنا مؤلف JSON تضمين تعليقات في JSON ، ولكن يجب حذفها قبل تحليلها (راجع plus.google.com/118095276221607585885/posts/RK8qyGVaGSr المقدم بواسطة Michael Burr). إذا كان يجب أن يكون لدى JSON تعليقات ، فلماذا لا يتم توحيدها ، ودع محلل JSON يقوم بالمهمة؟ لا أتفق مع المنطق هناك ، لكن ، للأسف ، هذا هو المعيار. يعد استخدام حل YAML كما اقترحه آخرون أمرًا جيدًا ، ولكنه يتطلب اعتمادًا على المكتبات.

إذا كنت ترغب في حذف التعليقات ، ولكنك لا تريد أن يكون لديك تبعية للمكتبة ، فإليك حلاً من سطرين ، يعمل على تعليقات نمط C ++ ، ولكن يمكن تكييفه مع الآخرين:

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

لاحظ أنه لا يمكن استخدام هذا الحل إلا في الحالات التي يمكنك فيها التأكد من أن بيانات JSON لا تحتوي على بادئًا للتعليق ، على سبيل المثال ("//").

هناك طريقة أخرى لتحقيق تحليل JSON ، وتجريد التعليقات ، وعدم وجود مكتبة إضافية ، وهي تقييم JSON في مترجم جافاسكريبت. إن التحذير من هذا النهج ، بطبيعة الحال ، هو أنك لن ترغب إلا في تقييم البيانات غير الملوثة (بدون إدخال مستخدم غير موثوق به). في ما يلي مثال على هذا النهج في Node.js - تحذير آخر ، سيقتصر المثال التالي على قراءة البيانات مرة واحدة فقط ، وبعد ذلك سيتم تخزينها مؤقتًا:

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






comments