چرا ویرگول انتهایی JSON را میشکند
جمعبندی: ویرگول انتهایی در object literalهای جاوااسکریپت قانونی و در 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,] روی ] شکست میخورد.
عادت از کجا میآید
object literalهای جاوااسکریپت از ES5 ویرگول انتهایی را مجاز میدانند، همچنین لیستهای Python و composite literalهای Go. ویرایشگرها خودکار اضافهشان میکنند. بعد کسی یک object literal را از فایل .js در فایل .json کپی میکند و فایل از تجزیه بازمیماند.
منبع رایج دیگر JSON دستساز است: حلقهای که با i <= length اجرا میشود بعد از عنصر آخر یک ویرگول باقی میگذارد.
سه اصلاح
ویرگول را حذف کنید. برای ویرایش دستی خوب است. در قالببند JSON جایگذاری کنید و خطا با خط و ستون گزارش میشود تا ببینید کدام را باید حذف کنید.
بهعنوان JSON5 تجزیه کنید. ابرمجموعهها ویرگول انتهایی را میپذیرند که برای پیکربندی محلی خوب است. برای هر چیزی که به سیستم دیگری میفرستید خوب نیست — گیرنده همچنان ردش میکند.
الحاق رشتهها را متوقف کنید. از JSON.stringify، json.dumps، Jackson استفاده کنید. سریالایزر جداکنندهها را درست مدیریت میکند و همزمان escaping را هم حل میکند.
فهرست بررسی سریع
| کجا | علت معمول |
|---|---|
| الحاق در حلقه | i <= length یک ویرگول اضافه باقی میگذارد |
| کپی-چسباندن | object literal برداشتهشده از فایل JS |
| قالبها | ویرگول سختکدشده بههمراه حلقهای که یکی دیگر اضافه میکند |
| ویرایش دستی | آخرین فیلد حذف شد و ویرگولش ماند |
پرسشهای متداول
چرا ویرگول انتهایی در جاوااسکریپت قانونی است اما در JSON نه؟
object literalهای جاوااسکریپت از ES5 آن را مجاز میدانند، همچنین لیستهای Python و composite literalهای Go، و همین است که عادت را با افراد به JSON میآورد. RFC 8259 ویرگول را فقط بین اعضا مجاز میداند: آخرین عضو مستقیماً با } یا ] دنبال میشود. کپی کردن object literal از فایل .js در فایل .json منبع معمول است.
آیا برای پذیرش ویرگول انتهایی بهعنوان JSON5 تجزیه کنم؟
فقط برای پیکربندی محلی. ابرمجموعهها ویرگول انتهایی را میپذیرند، اما هر چیزی که به سیستم دیگری میفرستید بهعنوان JSON سختگیر تجزیه میشود و همچنان شکست میخورد. در مرز خروجی JSON استاندارد تولید کنید نه اینکه به سهلگیری گیرنده تکیه کنید.
پس از خطای ویرگول انتهایی اول کجا را نگاه کنم؟
با موقعیت در پیام خطا شروع کنید: معمولاً به ویرگول پیش از } یا ] اشاره میکند. سپس سه منبع معمول را بررسی کنید: حلقهای که با i <= length نوشته شده، object literal چسباندهشده از فایل JS و قالبی که ویرگولی سختکدشده کنار حلقه دارد. جایگذاری در قالببند خط و ستون دقیق را گزارش میکند.