هل يمكنك استخدام فاصلة زائدة في كائن JSON؟

عند إنشاء كائن أو مصفوفة JSON يدويًا ، يكون من الأسهل غالبًا ترك فاصلة زائدة على العنصر الأخير في الكائن أو الصفيف. على سبيل المثال ، قد تبدو التعليمات البرمجية للإخراج من صفيف سلاسل (في pseudocode C ++ مثل):

s.append("[");
for (i = 0; i < 5; ++i) {
    s.appendF("\"%d\",", i);
}
s.append("]");

يعطيك سلسلة مثل

[0,1,2,3,4,5,]

هل هذا مسموح؟

321
من المثير للاهتمام (أو المرعب) في IE 8 لقد وجدت أن التنبيه ([1 ، 2 ، 3 ،] .length) سيعرض "4".
وأضاف المؤلف Daniel Earwicker, مصدر
كنت أتساءل أيضا ، لذلك فهو سؤال معقول تماما.
وأضاف المؤلف hoju, مصدر
رداً على فكرة استخدام SO كإشارة مرجعية اجتماعية لأسئلة البرمجة الشائعة: ما الخطأ في إضافة محتوى سيجلب حتمًا المزيد من المبرمجين (وخبرتهم) إلى الموقع؟
وأضاف المؤلف dclowd9901, مصدر
وكما قال جيف ، أعتقد أنه من المناسب تمامًا استخدام SO كـ "دفتر ملاحظات" لأشياء كان عليك قضاء بعض الوقت في البحث عنها. من المؤكد أن هذا في نهاية هذه الأنواع البسيطة من العناصر ، ولكن ما زلت أعتقد أنه مناسب ، خاصة وأن محركات جافا سكريبت المختلفة ستتعامل مع هذا الأمر بشكل مختلف.
وأضاف المؤلف pkaeding, مصدر
DanielEarwicker: غير ذي صلة ، نظرًا لأن هذا ليس JSON.
وأضاف المؤلف Lightness Races in Orbit, مصدر
إذا لم يكن JSON مخصصًا لمحركات جافا سكريبت ، فلماذا يطلق عليه اسم "رمز كائن جافا سكريبت"؟
وأضاف المؤلف James Curran, مصدر
كان هناك شيء أحتاجه للبحث على الويب قبل بضعة أيام. لم أجد جوابًا هنا على SO ، لذا بعد اتباع مهمة الموقع ، طرحت السؤال وأجبت عليه حتى يتمكن الآخرون من العثور عليه. هذا شيء قاله جيف بوضوح أنه يريد القيام به هنا.
وأضاف المؤلف Ben Combee, مصدر
شكر! لم أكن أرغب في إزالة العلامة بنفسي.
وأضاف المؤلف Ben Combee, مصدر
ولكن هناك شيئًا آخر: لماذا تكتب OP يدويًا JSON؟ هذا نموذج مضاد واضح - يجب على المرء دائمًا استخدام مكتبة لإنشاء JSON ، أو التحويل إلى/من بنية الكائن التي تحتوي عليها اللغة. استخدام سلسلة السلاسل هو مجرد طلب عناء. ليس فقط لفواصل ، ولكن للتشفير ، الهروب ، التعشيش غير الصحيح. انها سيئة تماما مثل استخدام تلاعب سلسلة أو regexps ل XML.
وأضاف المؤلف StaxMan, مصدر
مع شيء أساسي بحيث يتم العثور على الجواب من خلال النظر في المواصفات الرسمية ، وهذا يبدو أكثر مثل الصيد للحصول على نقاط من تقديم إجابات مفيدة للمشاكل التي لم تحل. آسف يا صاح.
وأضاف المؤلف eyelidlessness, مصدر
على ما يستحق ، لم تكن شكواي أن السؤال بسيط (لقد أجبت بسرور على عدد من الأسئلة البسيطة هنا) ، ولكن يبدو (للوهلة الأولى) أن يكون سؤالًا موجهًا إلى نقاط سمعة الألعاب. ستلاحظ أيضًا بأنني أقرت بأن السؤال صحيح بعد بعض المناقشة.
وأضاف المؤلف eyelidlessness, مصدر
أزلت علامة السؤال المطروحة لأنه من الواضح أن هذا ليس معروفًا كما يجب أن يكون ، على الرغم من أنه مفصل بشكل واضح في المواصفات الرسمية.
وأضاف المؤلف eyelidlessness, مصدر
لأن حرفيات كائن جافا سكريبت ألهمت الشكل. الا تظن انها تقول ان محركات JS قد بدأت للتو في امتلاك قدرات JSON المدمجة؟ simonwillison.net/2006/Dec/20/json لكن لدى JSON العديد من القيود تفرضها JS ، على سبيل المثال. لا تتطلب حروف jE object الحرفية مفاتيحًا مدرجة.
وأضاف المؤلف eyelidlessness, مصدر
علاوة على ذلك ، فإن محركات JS التي تعالجها بشكل مختلف تنبع من حقيقة أن JS لا (حاليًا) تفهم JSON وتعامله ببساطة كحرف/كائن حرفي. الفرق هو اختلاف في معالجة المحرك للمعايير الحرفية/المصفوفة ، وهي لا مثل JSON.
وأضاف المؤلف eyelidlessness, مصدر
JSON ليس لمحركات Javascript ، إنه تنسيق تبادل بيانات عالمي. لا يوجد مجال للخطأ في الإجابة على السؤال ، لأنه محدد بوضوح.
وأضاف المؤلف eyelidlessness, مصدر
إذا كان أي عزاء ، لم أكن أسقط ، لقد أضفت العلامة فقط لأنني أعتقد أنها كانت مناسبة.
وأضاف المؤلف eyelidlessness, مصدر
وافق على أن هذا سؤال جيد للنشر. وصلت هنا عن طريق googling السؤال.
وأضاف المؤلف fool4jesus, مصدر

14 إجابة

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

بشكل عام ، أحاول حل المشكلة ، وأضف الفاصلة قبل القيمة الفعلية ، بحيث ينتهي بك الأمر برمز يبدو كالتالي:

s.append("[");
for (i = 0; i < 5; ++i) {
  if (i) s.append(",");//add the comma only if this isn't the first entry
  s.appendF("\"%d\"", i);
}
s.append("]");

هذا سطر واحد إضافي من التعليمات البرمجية في الحلقة الخاصة بك هو مكلف ...

Another alternative I've used when output a structure to JSON from a dictionary of some form is to always append a comma after each entry (as you are doing above) and then add a dummy entry at the end that has not trailing comma (but that is just lazy ;->).

لا يعمل بشكل جيد مع مصفوفة للأسف.

179
وأضاف
من العار حقا أن ECMA5 يحدد السقوف ، ولكن JSON لا.
وأضاف المؤلف FlavorScape, مصدر
نصيحة رائعة حول إضافة إدخال وهمية في النهاية!
وأضاف المؤلف dcsan, مصدر
نعم ، هذا الخط الزائد يكاد يكون مكلفا ، ولكن مصدر إزعاج مع ذلك.
وأضاف المؤلف René Nyffenegger, مصدر
هذا النهج يعمل من أجل الحلقات المفهرسة. ماذا عن ... في حلقات النمط؟ هل هناك طريقة أنيقة؟
وأضاف المؤلف sam, مصدر
إذا كنت تحب الشفرة المبهمة ، يمكنك تجنب الإضافة الإضافية على النحو التالي: s.appendF (& "، \"٪ d \ "" [! i]، i)؛ . يمكنك تبسيطها إلى "..." +! i ، ولكن قد يحذر المحول البرمجي حول حسابية السلسلة.
وأضاف المؤلف Marcelo Cantos, مصدر
اجابة جيدة. يرجى تقديم "دليل" (رابط إلى مستندات ومواصفات وغيرها) من إجابتك.
وأضاف المؤلف chharvey, مصدر
حسنًا ، لدي الآن مهمة لكتابة شجرة بناء جملة في شكل JSON أثناء إنشائها بأداة تلقائية مكدسة. لا أستطيع استخدام هذه الحيلة للأسف.
وأضاف المؤلف Calmarius, مصدر
هل هناك طريقة للحصول على فايرفوكس تتصرف مثل IE في هذا الصدد ، وإصدار خطأ أو على الأقل تحذير عند مواجهة فاصلة زائدة؟ أطور بشكل أساسي في Firefox لذا سيكون من الرائع أن يتم إعلامي بهذه المشكلة في أقرب وقت ممكن.
وأضاف المؤلف Michael Butler, مصدر
تحديث الرد للإجابة على السؤال صراحة. أوافق ، تخطي إجابتي الأولية صريحة ، "لا".
وأضاف المؤلف brianb, مصدر
يمكن أن يكون ذلك سطر واحد إضافي من التعليمات البرمجية معقدة عند التعامل مع الخصائص. قد تجد نفسك تحمل أطنان من إذا كان s فقط لتجنب تلك الفاصلة الصغيرة الغبية. حول قيمة YMMV ، راجع هذا على سبيل المثال jsfiddle.net/oriadam/mywL9384 توضيح: الحل الخاص بك رائع ، أنا فقط أكره المواصفات التي تمنع فاصلة زائدة.
وأضاف المؤلف oriadam, مصدر
لقد بدأت استخدام هذا التنسيق في كل شيفرة JS (الفاصلة قبل العنصر في نفس السطر) لهذا السبب بالضبط. يجعل الفواصل الزائدة إضافية أسهل بكثير ، ويوفر الكثير من الوقت. إنه أمر مزعج ، أتمنى أن يكون هناك خيار لإلقاء خطأ لهذا مع فايرفوكس (لأن ذلك قد يساعد في تصحيح الأخطاء).
وأضاف المؤلف rocketmonkeys, مصدر

لا. لا تسمح مواصفات JSON ، كما يتم الاحتفاظ بها في http://json.org ، بفواصل زائدة. من ما رأيته ، قد يسمح بعض المتصفحات بصمت لهم عند قراءة سلسلة JSON ، في حين أن الآخرين سوف يرمي الأخطاء. للحصول على إمكانية التشغيل المتداخل ، يجب عدم تضمينها.

يمكن إعادة هيكلة الكود السابق ، إما لإزالة الفاصلة الزائدة عند إضافة فاصل الصفيف أو لإضافة الفاصلة قبل العناصر ، وتخطي ذلك لأول مرة.

113
وأضاف
وهذه هي الإجابة الصحيحة على السؤال.
وأضاف المؤلف cdiggins, مصدر
ECMA 262 يبدو أنه يعرّفه في القسم 11.1.5 - كائن المبدئ. ما إذا كان هذا جيد أم لا ، يبدو في المواصفات.
وأضاف المؤلف Zero Distraction, مصدر
ZeroDistraction: يعرّف ECMA262 ECMAscript (المعروف أيضًا باسم javascript) وهي لغة برمجة مثل Perl أو ruby أو C ++ أو Java. JSON عبارة عن تنسيق بيانات مثل xml أو CSV أو YAML. انهم ليسوا نفس الشيء. JSON غير موجود في EXMA262 لكن بناء الجملة مشتق من فعله ويسمى تدوين الحرفي للكائن (ON في JSON).
وأضاف المؤلف slebetman, مصدر
لا يعني استخدام ECMAScript الصحيح بالضرورة أن المستند صالح JSON - يتم تعريف JSON بشكل عام في RFC 4627 ، ولا تسمح هذه المواصفات بفاصلة زائدة.
وأضاف المؤلف Tim Gilbert, مصدر

بسيطة ، ورخيصة ، وسهلة القراءة ، وتعمل دائما بغض النظر عن المواصفات.

$delimiter = '';
for ....  {
    print $delimiter.$whatever
    $delimiter = ',';
}

المهمة الزائدة عن الحاجة إلى $ delim هي سعر صغير جدًا للدفع. كما يعمل كذلك إذا لم يكن هناك حلقة صريحة ولكن أجزاء شفرة منفصلة.

96
وأضاف
هذا ما أفعله عادة في حالات كهذه ؛ أشعر أن التعيين الإضافي قابل أكثر من التعويض عن طريق إزالة الشرطية المطلوبة لإلحاق الفاصلة قبل القيمة في النهج البديل ( stackoverflow.com/ و/ 201856/8946 ).
وأضاف المؤلف Lawrence Dol, مصدر
أيضًا ، من الأفضل احتواء نطاق الفاصل: لـ (let ...، sep = ""؛ ...؛ sep = "،") {...
وأضاف المؤلف Lawrence Dol, مصدر
لا أحب هذا الحل ، فهناك متغير آخر يلوث نطاقي. واحد إذا أسهل للفهم. لكن شكرا على المشاركة.
وأضاف المؤلف Ich, مصدر

يُسمح بفواصل مكررة في جافا سكريبت ، لكن لا تعمل في IE. لم تسمح لهم مواصفات JSON من دوغلاس كروكفورد ، ولأنها كانت بدون نسخة لم يكن من المفترض أن يتغير هذا. سمحت مواصفات ES5 JSON لهم كامتداد ، ولكن RFC 4627 في Crockford لم ينجح ، وتم إرجاع ES5 لعدم السماح لهم. تلت ذلك Firefox . إنترنت إكسبلورر هو السبب في أننا لا يمكن أن يكون لدينا أشياء لطيفة.

15
وأضاف
لقد جربتهم في IE 11 بدون أي مشكلة. ما هي إصدارات IE التي اختبرت فيها ، حيث وجدتها تسبب مشاكل؟
وأضاف المؤلف iconoclast, مصدر
يبدو أن كروكفورد هو السبب في أننا لا نستطيع الحصول على أشياء لطيفة. هذا والتعليقات في JSON
وأضاف المؤلف Hejazzman, مصدر
وأضاف المؤلف Tobu, مصدر

قد ترغب مبرمجو PHP في التحقق من ترميز() . هذا يأخذ صفيف ينضم ذلك باستخدام سلسلة.

من المستندات ...

$array = array('lastname', 'email', 'phone');
echo implode(",", $array);//lastname,email,phone
11
وأضاف
وبالمثل ، فإن JavaScript لديها join() . معظم اللغات لها طريقة مشابهة ، أو يمكن تشفيرها بسهولة.
وأضاف المؤلف Dan Burton, مصدر
لدى PHP json_encode ، الذي يتعامل مع جميع تفاصيل إنشاء JSON ، وليس فقط بالفواصل.
وأضاف المؤلف Brilliand, مصدر
معظم اللغات ، باستثناء جافا.
وأضاف المؤلف Robert, مصدر

As it's been already said, JSON spec (based on ECMAScript 3) doesn't allow trailing comma. ES >= 5 allows it, so you can actually use that notation in pure JS. It's been argued about, and some parsers did support it (http://bolinfest.com/essays/json.html, http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-no-longer-accepted/), but it's the spec fact (as shown on http://json.org/) that it shouldn't work in JSON. That thing said...

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

مثلا (في pseudocode C- تشبه الشفرة المقترحة لـ OP):

s.append("[");
// MAX == 5 here. if it's constant, you can inline it below and get rid of the comparison
if ( MAX > 0 ) {
    s.appendF("\"%d\"", 0);//0-th iteration
    for( int i = 1; i < MAX; ++i ) {
        s.appendF(",\"%d\"", i);//i-th iteration
    }
}
s.append("]");
8
وأضاف

Interestingly, both C & C++ (and I think C#, but I'm not sure) specifically allow the trailing comma -- for exactly the reason given: It make programmaticly generating lists much easier. Not sure why JavaScript didn't follow their lead.

6
وأضاف
PHP كما يسمح ذلك. أعتقد أنها ميزة واحدة لـ PHP التي أحبها. ؛ ع
وأضاف المؤلف iconoclast, مصدر
تعمل الفواصل الزائدة في Firefox ، ولكن ليس في IE.
وأضاف المؤلف kzh, مصدر
حددت ECMA صراحة أن الفواصل اللاحقة مسموح بها في المواصفات القادمة: ejohn.org/blog/bug-fixes-in-javascript-2 هناك سبب آخر لتوضيح أن JSON! = JS Object.
وأضاف المؤلف eyelidlessness, مصدر

استخدم JSON5. لا تستخدم JSON.

  • يمكن أن تحتوي الكائنات والصفائف على فواصل متأخرة
  • مفاتيح الكائن يمكن أن تكون غير مقعرة إذا كانت معرّفات صالحة
  • يمكن أن تكون السلاسل أحادية الاقتباس
  • يمكن تقسيم السلاسل عبر أسطر متعددة
  • يمكن أن تكون الأرقام سداسي عشري (قاعدة 16)
  • يمكن أن تبدأ الأرقام أو تنتهي بنقطة عشرية (رائدة أو لاحقة).
  • يمكن أن تتضمن الأرقام Infinity و -Infinity.
  • يمكن أن تبدأ الأرقام بعلامة زائد (+) صريحة.
  • يُسمح بالتعليقات المضمنة (أحادية الأسطر) والحظر (متعدد الأسطر).

http://json5.org/

https://github.com/aseemk/json5

5
وأضاف
أيضا ، سلاسل mutliline هي رهيبة. أحلم في ES6 multilines.
وأضاف المؤلف Marco Sulla, مصدر
تبدو لطيفة ، ولكن عدم إضافة أنواع البيانات الجديدة يبدو وكأنه فرصة ضائعة ... بالطبع الرغبة في البقاء مجموعة فرعية صارمة من ECMAScript 5 القوات ، ولكن لا يزال ...
وأضاف المؤلف iconoclast, مصدر
لا ، هذه نصيحة مروعة. من بين جميع مكتبات JSON الموجودة ، يدعم عدد قليل جدا هذا التمديد ؛ وكل هذا "للتحسينات" المشكوك فيها للغاية. يرجى عدم التسبب في مزيد من التآكل للتشغيل البيني بواسطة ملحقات وهمية جديدة مثل هذه.
وأضاف المؤلف StaxMan, مصدر
أعتقد أن إنفاق حياتك على إصلاح الفواصل هو أكثر فظاعة.
وأضاف المؤلف user619271, مصدر

أحتفظ بعدد حالي وأقارنه بإحصاء إجمالي. إذا كان العدد الحالي أقل من العدد الإجمالي ، فأعرض الفاصلة.

قد لا يعمل إذا لم يكن لديك حساب إجمالي قبل تنفيذ جيل JSON.

ثم مرة أخرى ، إذا كنت تستخدم PHP 5.2.0 أو أفضل ، فيمكنك فقط تنسيق استجابتك باستخدام واجهة برمجة تطبيقات JSON المدمجة.

1
وأضاف

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

كل من فايرفوكس وكروم يعالج الأمر على ما يرام. ولكن يبدو أن IE (كل الإصدارات) تنكسر. أعني حقا كسر ووقف قراءة بقية النص.

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

:)

1
وأضاف

وفقًا لمواصفات Class JSONArray :

  • قد تظهر (فاصلة) إضافية قبل قوس الإغلاق مباشرةً. </لى>
  • سيتم إدراج القيمة الفارغة عند وجود ، (فاصلة) تشعيبية.

لذا ، كما أفهمها ، يجب أن يُسمح لها بالكتابة:

[0,1,2,3,4,5,]

ولكن قد يحدث أن يقوم بعض المتصفّحين بإرجاع الرقم 7 كعدد عناصر (مثل IE8 كما أشار دانيال إيرويكر) بدلاً من 6 المتوقعة.


تعديل:

لقد عثرت على JSON Validator الذي يثبت صلاحية سلسلة JSON مقابل RFC 4627 (نوع وسائط التطبيق/json لترميز كائن جافا سكريبت) ومقابل مواصفات لغة جافا سكريبت. في الواقع هنا يعتبر مصفوفة مع فاصلة زائدة صالحة فقط لجافا سكريبت وليس للمواصفات RFC 4627.

ومع ذلك ، في مواصفات RFC 4627 موضح ما يلي:

2.3. صفائف

     

يتم تمثيل بنية مصفوفة كأقواس مربعة حول الصفر   أو المزيد من القيم (أو العناصر). يتم فصل العناصر بفواصل.

 array = start-array [value * (value separator value)] end-array
</القانون> </قبل>

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

P.S. RFC 4627 isn't a standard (as explicitly stated), and is already obsolited by RFC 7159 (which is a proposed standard) RFC 7159

1
وأضاف
القاعدة النحوية المعطاة دقيقة بقدر ما يمكنك الحصول عليها. لا توجد طريقة للحصول على فاصل القيمة بدون القيمة بجواره مباشرة. أيضا النص محدد جدا. لا يمكن تطبيق "فصل القيم" إلا إذا كانت هناك قيم متعددة. لذا إذا كان لديك قيمتين بجوار بعضهما البعض ، فسيتم فصلهما باستخدام فاصلة. إذا كان لديك قيمة واحدة (أو إذا نظرت فقط إلى القيمة في النهاية) ، فلا يوجد فصل ، وبالتالي لا توجد فاصلة.
وأضاف المؤلف Steffen Heil, مصدر

أنا عادة حلقة عبر الصفيف وإرفاق فاصلة بعد كل إدخال في السلسلة. بعد الحلقة ، أحذف الفاصلة الأخيرة مرة أخرى.

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

0
وأضاف

باستخدام JSON المريح ، يمكن أن يكون لديك فواصل متأخرة ، أو اترك الفواصل خارجًا . فهي اختيارية.

لا يوجد سبب على الإطلاق في ضرورة وجود الفواصل لتحليل وثيقة تشبه JSON.

ألق نظرة على مواصفات JSON المهدئة وسترى كيف تكون "الضوضاء" هي مواصفات JSON الأصلية. طريقة الكثير من الفواصل والاقتباسات ...

http://www.relaxedjson.org

يمكنك أيضًا تجربة مثالك باستخدام محلل RJSON هذا عبر الإنترنت ورؤيته يتم تحليله بشكل صحيح.

http://www.relaxedjson.org/docs/converter.html؟source=٪5B0٪2C1٪2C2٪2C3٪2C4٪2C5٪2C٪5D

0
وأضاف

لا يُنصح بذلك ، ولكن لا يزال بإمكانك فعل شيء كهذا لتحليله.

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

jsonStr = '[0,1,2,3,4,5,]';
let data;
eval('data = ' + jsonStr);
console.log(data)
</div> </div>
0
وأضاف