لماذا تسبب الفاصلة الزائدة كسر JSON
الخلاصة: الفواصل الزائدة قانونية في كائنات JavaScript الحرفية وقاتلة في JSON. هنا الخطأ الدقيق، وقواعد RFC 8259 التي تسببه، وثلاثة إصلاحات تصمد فعلًا.

الخلاصة: JSON يمنع الفواصل الزائدة في كل مكان — عندما يفشل المحلل، احذف الفاصلة الأخيرة بمنسّق؛ واستخدم JSON5 أو JSONC للتحليل المحلي المتسامح فقط، وأخرج دائمًا JSON قياسيًا إلى الأنظمة الأخرى.
لأن القواعد تقول ذلك.
{
"name": "demo",
"size": 12,
}
يرمي JSON.parse الخطأ Unexpected token } in JSON at position 34. تصوغه Node بصيغة مختلفة، لكن كل محرك يشير إلى المكان نفسه: الفاصلة قبل }.
ما الذي يشكو منه المحلل فعلًا
إنتاج الكائن في RFC 8259 هو:
object = begin-object [ member *( value-separator member ) ] end-object
الأقواس المربعة تعني اختياريًا، والنجمة تعني صفرًا أو أكثر. بعبارات بسيطة: الفواصل تفصل الأعضاء، والعضو الأخير يتبعه } مباشرة.
لذا بعد فاصلة يكون المحلل جاهزًا لاسم عضو آخر. يقرأ } فيفشل. المصفوفات تتصرف بالمثل — [1, 2, 3,] يفشل عند ].
من أين تأتي العادة
تسمح كائنات JavaScript الحرفية بالفواصل الزائدة منذ ES5، وكذلك قوائم Python ومركبات Go الحرفية. والمحررات تضيفها تلقائيًا. ثم ينسخ أحدهم كائنًا حرفيًا من ملف .js إلى ملف .json فيتوقف الملف عن التحليل.
المصدر الشائع الآخر هو JSON المبني يدويًا: حلقة تنفّذ i <= length تترك فاصلة بعد العنصر الأخير.
ثلاثة إصلاحات
احذف الفاصلة. مناسب للتحريرات اليدوية. الصق في منسّق JSON فيُبلَّغ عن الخطأ بالسطر والعمود، فترى بالضبط أي فاصلة تحذف.
حلّل كـJSON5. المجموعات الشاملة تقبل الفواصل الزائدة، وهذا مناسب للتهيئة المحلية. لكنه ليس مناسبًا لأي شيء ترسله إلى نظام آخر — فالمستقبل سيرفضه أيضًا.
توقف عن تسلسل النصوص. استخدم JSON.stringify أو json.dumps أو Jackson. يتعامل المسلسل مع الفواصل بشكل صحيح ويحل الهروب في الوقت نفسه.
قائمة تدقيق سريعة
| المكان | السبب النمطي |
|---|---|
| تسلسل الحلقات | i <= length يترك فاصلة إضافية |
| النسخ واللصق | كائن حرفي مرفوع من ملف JS |
| القوالب | فاصلة مكتوبة صراحةً مع حلقة تضيف أخرى |
| التحرير اليدوي | حُذف الحقل الأخير وبقيت فاصلته |
الأسئلة الشائعة
لماذا الفواصل الزائدة قانونية في JavaScript وليست في JSON؟
سمحت كائنات JavaScript الحرفية بها منذ ES5، وكذلك قوائم Python ومركبات Go الحرفية، ولهذا تتبع العادة الناس إلى JSON. يسمح RFC 8259 بالفواصل بين الأعضاء فقط: العضو الأخير يتبعه } أو ] مباشرة. ونسخ كائن حرفي من ملف .js إلى ملف .json هو المصدر المعتاد.
هل يجب أن أحلل كـJSON5 لقبول الفواصل الزائدة؟
فقط للتهيئة المحلية. المجموعات الشاملة تقبل الفواصل الزائدة، لكن أي شيء ترسله إلى نظام آخر يُحلَّل كـJSON صارم وسيفشل ما زال. ولّد JSON قياسيًا عند حد الإخراج بدلًا من الاعتماد على تسامح المستقبل.
أين أنظر أولًا بعد خطأ الفاصلة الزائدة؟
ابدأ بالموضع في رسالة الخطأ: إنه عادةً يشير إلى الفاصلة قبل } أو ]. ثم تحقق من المصادر الثلاثة المعتادة: حلقة مكتوبة بـi <= length، وكائن حرفي ملصوق من ملف JS، وقالب يثبّت فاصلة بجانب حلقة. واللصق في منسّق يبلّغ عن السطر والعمود بدقة.