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




15 Answers

لا.

يجب أن تكون 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.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 هذا النوع من JSON. سوف المتناثرة تدفق على وجه الخصوص الاختناق.

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

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

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

({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.org .

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




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

مثال:

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

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




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

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

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

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




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

// "name": "string"

// "id": int

أو

/* هذا ال

مثال تعليق * /

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

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

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

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

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




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

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

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




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

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




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

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

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




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

{

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

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

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

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

}



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



Related

json comments