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




(25)

يعتمد ذلك على مكتبة JSON. يدعم Json.NET التعليقات على نمط JavaScript /* commment */.

راجع سؤال آخر حول Stack Overflow .

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


فكر في استخدام YAML. إنها عبارة عن مجموعة شاملة من JSON (كل JSON الصالحة تقريبًا صالحة لـ YAML) وتسمح بالتعليقات.


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

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

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


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

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

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

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


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

لقد قمت للتو بإصدار 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 صالح. مجرد جعل نفس المفتاح مرتين (أو أكثر). فمثلا:

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

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

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

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

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


نحن نستخدم 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 إلى أجزاء أقوم بإضافة خطوط "تعليق وهمية":

{

"#############################" : "Part1",

"data1"             : "value1",
"data2"             : "value2",

"#############################" : "Part2",

"data4"             : "value3",
"data3"             : "value4"

}

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 قبل تمريرها إلى المحلل اللغوي!


التعليقات ليست معيارا رسميا. على الرغم من أن بعض المحللين يدعمون 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 هي توفير تبادل بيانات بسيط بين التطبيقات. هذه عادةً ما تستند إلى الويب واللغة هي JavaScript.

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

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

إلقاء نظرة على موقع JSON لمزيد من التفاصيل.


لا ، لا يُسمح بتعليقات النموذج //… أو /*…*/ في JSON. تعتمد هذه الإجابة على:

  • http://www.json.org
  • RFC 4627 : نوع وسائط application/json كائن JavaScript (JSON)
  • RFC 7159 تنسيق تبادل بيانات عناصر كائن JavaScript (JSON) - عفا عليها الزمن: 4627 ، 7158

هل يمكن أن يكون لديك تعليق في JSONP ، ولكن ليس في JSON النقي. لقد قضيت للتو ساعة في محاولة لجعل برنامجي يعمل مع هذا المثال من Highcharts: http://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منذ ذلك الحين ، حسنًا ، ترجع JSONP جافا سكريبت الخالصة. في هذه الحالة ، يُسمح بالتعليقات . لكن طلبي عاد من نوع المحتوى application/json، لذلك اضطررت إلى إزالة التعليقات.


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

مثال:

{
    "description":"A person",
    "type":"object",
    "properties":
        {
            "name":
                {
                    "type":"string"
                },
            "age":
                {
                    "type":"integer",
                    "maximum":125
                }
        }
}

يمكنك تقديم الوثائق باستخدام سمة الوصف الوصفية .


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

لا ، يجب ألا تستخدم أعضاء الكائنات المكررة في إدخال بيانات القناة الجانبية إلى تشفير 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 ليس بروتوكولًا مؤطرًا . إنه تنسيق لغة خالية . لذلك لم يتم تعريف تنسيق التعليقات لـ JSON.

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


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

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

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


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

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

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

لنفترض أنك تستخدم JSON للاحتفاظ بملفات التهيئة ، التي ترغب في إضافة تعليقات إليها. المضي قدما وإدراج جميع التعليقات التي تريدها. ثم قم بتوصيله عبر JSMin قبل تسليمه إلى محلل 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"
            }
         }
      }
   }
}

إذا كنت تستخدم مكتبة Newtonsoft.Json مع ASP.NET للقراءة / إلغاء التسلسل ، فيمكنك استخدام التعليقات في محتوى JSON:

// "name": "string"

// "id": int

أو

/* هذا ال

مثال تعليق * /

ملاحظة: يتم دعم التعليقات ذات سطر واحد فقط مع أكثر من 6 إصدارات من Newtonsoft Json.

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

أفضِّل كتابة تعليقات حول كل إعداد فردي في ملف JSON نفسه ، ولا يهمني تكامل تنسيق JSON طالما أن المكتبة التي أستخدمها لا بأس بها.

أعتقد أن هذه طريقة "أسهل في الاستخدام / الفهم" من إنشاء ملف "إعدادات .README" منفصل وشرح الإعدادات الموجودة فيه.

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


يريدنا مؤلف 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));

إليك ما وجدته في وثائق 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"
}

سأضيف النقطة بشكل غير فعال تمامًا ، لمجرد أنني لا أستطيع مساعدة نفسي ولم أرها حتى الآن ، وأن السؤال غير صحيح لأنه يحتوي على فرضية خفية خاطئة ، أي أن الشفرة في تعليق!

في Java source code \ u000d يساوي كل طريقة لحرف ASCII CR. إنه خط منتهي ، سهل وبسيط ، أينما يحدث. التنسيق في السؤال مضلل ، ما يتوافق معه هذا التسلسل من الأحرف في الواقع هو:

public static void main(String... args) {
   // The comment below is no typo. 
   // 
 System.out.println("Hello World!");
}

IMHO الجواب الصحيح لذلك هو: تنفيذ التعليمات البرمجية لأنها ليست في تعليق. انها على السطر التالي. "تطبيق الشفرة في التعليقات" غير مسموح به في جافا ، تمامًا كما تتوقع.

وينبع الكثير من الارتباك من حقيقة أن أجهزة تحديد المواقع والنماذج IDEs ليست متطورة بما يكفي لوضع هذا الوضع في الاعتبار. إما أنهم لا يعالجون عمليات الهروب في Unicode على الإطلاق ، أو يفعلون ذلك بعد تحليل الشفرة بدلاً من السابق ، مثل javac .





json comments