How to Fix Invalid JSON: Common Errors & Solutions
Diagnose and fix the 10 most common JSON errors developers encounter. Each error includes before/after code examples and a clear explanation of why it happens.
لماذا تفشل عملية تحليل JSON
يبدو أن JSON بسيط - وهو كذلك - لكن صرامته هي بالضبط ما يعيق الناس. على عكس كائنات JavaScript، لا يتحمل JSON أي اختصارات في الصياغة. لا توجد فواصل زائدة. لا توجد علامات اقتباس مفردة. لا توجد تعليقات. كل انحراف ينتج عنه خطأ في التحليل، وغالبًا ما تكون رسائل الخطأ غير مفيدة: Unexpected token أو JSON.parse: expected ',' or '}' في السطر 1.
تتناول هذه الدليل أكثر 10 أخطاء شائعة في JSON يواجهها المطورون في البرية. يتضمن كل منها JSON المكسور، ولماذا يرفضه المحلل، والإصدار المصحح. احفظ هذه الصفحة في المفضلة - ستعود إليها.
جرب بنفسك: ألصق JSON مكسور في أداتنا إصلاح JSON لإصلاح معظم هذه الأخطاء تلقائيًا على الفور.
الخطأ 1: فاصلة زائدة
هذا هو الخطأ الأكثر شيوعًا في JSON. يسمح JavaScript بالفواصل الزائدة في الكائنات والمصفوفات، لذا يكتب المطورون JSON بالطريقة نفسها بشكل طبيعي. لكن JSON لا يسمح بذلك.
مكسور:
{
"name": "Alice",
"age": 30,
}
مصحح:
{
"name": "Alice",
"age": 30
}
تسبب الفاصلة الزائدة بعد 30 في توقع المحلل وجود زوج مفتاح-قيمة آخر. عندما يجد قوسًا مغلقًا بدلاً من ذلك، يتعطل. قم بإزالة الفاصلة بعد آخر عنصر في كل كائن ومصفوفة.
الخطأ 2: علامات اقتباس مفردة بدلاً من علامات اقتباس مزدوجة
يتطلب JSON علامات اقتباس مزدوجة لكل من المفاتيح والقيم النصية. تعتبر علامات الاقتباس المفردة من خصائص JavaScript التي يرفضها محلل JSON بشكل قاطع.
مكسور:
{
'name': 'Alice',
'city': 'Portland'
}
مصحح:
{
"name": "Alice",
"city": "Portland"
}
يحدث هذا غالبًا عند نسخ كائنات الأدب من كود JavaScript أو من قواميس Python (التي تستخدم أيضًا علامات الاقتباس المفردة). إصلاحه يكون عن طريق البحث والاستبدال من ' إلى "، لكن كن حذرًا مع السلاسل التي تحتوي على علامات اقتباس - تحتاج إلى الهروب.
الخطأ 3: مفاتيح غير محاطة بعلامات اقتباس
يسمح JavaScript بكتابة { name: "Alice" } دون إحاطة المفتاح بعلامات اقتباس. لكن JSON لا يسمح بذلك. يجب أن تكون كل مفتاح سلسلة محاطة بعلامات اقتباس مزدوجة.
مكسور:
{
name: "Alice",
age: 30
}
مصحح:
{
"name": "Alice",
"age": 30
}
يظهر هذا عادة عندما يكتب شخص ما JSON يدويًا أو ينسخ كائن JavaScript دون تحويله. ستعرض بعض المحررات وأدوات تصحيح API المفاتيح غير المحاطة بعلامات اقتباس بسعادة، مما يخفي المشكلة حتى تحاول تحليل الملف في مكان آخر.
الخطأ 4: تعليقات في JSON
لا يدعم JSON التعليقات - لا // للتعليقات ذات السطر الواحد، ولا /* */ للتعليقات الكتلية. هذه واحدة من أكثر القيود إحباطًا في التنسيق، خاصة لملفات التكوين.
مكسور:
{
// إعدادات قاعدة البيانات
"host": "localhost",
"port": 5432 /* منفذ PostgreSQL الافتراضي */
}
مصحح:
{
"host": "localhost",
"port": 5432
}
إذا كنت بحاجة إلى تعليقات في ملفات التكوين، فكر في استخدام JSONC (JSON مع تعليقات)، الذي يدعمه VS Code وTypeScript بشكل أصلي، أو الانتقال إلى YAML أو TOML. بالنسبة لـ JSON القياسي، قم بإزالة جميع التعليقات قبل التحليل.
الخطأ 5: فاصلة مفقودة بين العناصر
عند إضافة حقل جديد إلى كائن JSON، من السهل نسيان الفاصلة التي تفصل بينه وبين الحقل السابق. يرى المحلل قيمتين متتاليتين بدون فاصل ويتعطل.
مكسور:
{
"name": "Alice"
"age": 30
}
مصحح:
{
"name": "Alice",
"age": 30
}
تشير رسالة الخطأ عادةً إلى السطر بعد الفاصلة المفقودة، مما قد يكون مضللًا. إذا رأيت Unexpected string أو Expected comma، انظر إلى السطر أعلاه الموضع المبلغ عنه.
الخطأ 6: قوس أو قوس مغلق مفقود
من الصعب اكتشاف الأقواس غير المتطابقة في ملفات JSON الكبيرة. يتسبب القوس المفقود ] أو } في قراءة المحلل بعد نهاية الهيكل المقصود، مما ينتج عنه أخطاء مربكة بعيدة عن المشكلة الفعلية.
مكسور:
{
"users": [
{ "name": "Alice" },
{ "name": "Bob" }
}
مصحح:
{
"users": [
{ "name": "Alice" },
{ "name": "Bob" }
]
}
الإصلاح: استخدم محررًا مع مطابقة الأقواس (VS Code يبرز الأزواج المتطابقة) أو مدقق JSON الذي يبلغ عن الموقع الدقيق للاختلاف.
الخطأ 7: undefined، NaN، أو Infinity
هذه قيم JavaScript صالحة ولكن ليس لها تمثيل في JSON. يقوم JSON.stringify بتحويل undefined بهدوء إلى null (أو يتجاهل المفتاح تمامًا)، لكن إذا كتبت هذه القيم يدويًا، يرفضها المحلل.
مكسور:
{
"score": NaN,
"callback": undefined,
"limit": Infinity
}
مصحح:
{
"score": null,
"callback": null,
"limit": null
}
استبدل undefined و NaN بـ null، أو تجاهل المفتاح تمامًا إذا كان غياب القيمة مناسبًا من الناحية الدلالية. بالنسبة لـ Infinity، فكر في استخدام رقم مرسوم أو تمثيل نصي مثل "Infinity" ومعالجته في كود التطبيق الخاص بك.
الخطأ 8: فاصلة زائدة بعد آخر عنصر في المصفوفة
هذا هو الإصدار الخاص بالمصفوفة من الخطأ 1. يظهر باستمرار في ملفات JSON المعدلة يدويًا، خاصة بعد حذف أو إعادة ترتيب العناصر.
مكسور:
{
"colors": [
"red",
"green",
"blue",
]
}
مصحح:
{
"colors": [
"red",
"green",
"blue"
]
}
النمط هو نفسه: الفاصلة بعد "blue" تخبر المحلل بتوقع عنصر آخر. يجد ] بدلاً من ذلك ويبلغ عن خطأ. عند إزالة العناصر من مصفوفة JSON، تحقق دائمًا مما إذا كان العنصر الأخير الجديد يحتوي على فاصلة زائدة.
الخطأ 9: علامات الاقتباس الذكية (علامات الاقتباس المنحنية)
هذا واحد ماكر. عندما تقوم بنسخ JSON من مستند Word، أو رسالة Slack، أو منشور مدونة، قد يقوم نظامك بهدوء باستبدال علامات الاقتباس المستقيمة (") بعلامات الاقتباس "الذكية" الطباعة (\u201C و \u201D). تبدو متطابقة تقريبًا لكنها شخصيات مختلفة تمامًا.
مكسور:
{
\u201Cname\u201D: \u201CAlice\u201D,
\u201Ccity\u201D: \u201CPortland\u201D
}
مصحح:
{
"name": "Alice",
"city": "Portland"
}
عادةً ما تكون رسالة الخطأ Unexpected token في الموضع 1 أو 2، مما يكون محيرًا حتى تدرك أن شخصيات الاقتباس خاطئة. الإصلاح: استبدل جميع علامات الاقتباس المنحنية بعلامات اقتباس مزدوجة مستقيمة. في حالة الطوارئ، أعد كتابة علامات الاقتباس يدويًا في محرر نص عادي.
لمنع ذلك، استخدم دائمًا محرر كود (وليس محرر نص غني) لكتابة JSON. قم بتعطيل "علامات الاقتباس الذكية" في إعدادات لوحة المفاتيح في نظام التشغيل الخاص بك إذا كنت تقوم بلصق بين التطبيقات بشكل متكرر.
الخطأ 10: أحرف BOM (علامة ترتيب البايت)
BOM هو حرف غير مرئي (U+FEFF) تقوم بعض محررات النصوص في Windows بإدراجه في بداية ملف للإشارة إلى الترميز. ترى محللات JSON أنه حرف غير متوقع قبل القوس الافتتاحي وتفشل على الفور.
الأعراض:
SyntaxError: Unexpected token \uFEFF in JSON at position 0
لا يمكنك رؤية BOM في معظم المحررات - إنه غير مرئي حقًا. لاكتشافه، افتح الملف في محرر سداسي وابحث عن البايتات EF BB BF (BOM UTF-8) في البداية تمامًا.
كيفية الإصلاح:
- في VS Code، انقر على مؤشر الترميز في شريط الحالة واختر "حفظ مع الترميز" → "UTF-8" (بدون BOM).
- على سطر الأوامر:
sed -i '1s/^\xEF\xBB\xBF//' file.json - في Node.js، قم بإزالته قبل التحليل:
const clean = text.replace(/^\\uFEFF/, "");
مرجع سريع: جميع 10 أخطاء
| # | الخطأ | السبب | الإصلاح |
|---|---|---|---|
| 1 | فاصلة زائدة | فاصلة بعد الخاصية/العنصر الأخير | إزالة الفاصلة الزائدة |
| 2 | علامات اقتباس مفردة | استخدام ' بدلاً من " | استبدالها بعلامات اقتباس مزدوجة |
| 3 | مفاتيح غير محاطة بعلامات اقتباس | مفاتيح بدون علامات اقتباس مزدوجة | إحاطة جميع المفاتيح بعلامات اقتباس مزدوجة |
| 4 | تعليقات | // أو /* */ في JSON | إزالة جميع التعليقات |
| 5 | فاصلة مفقودة | لا توجد فاصلة بين العناصر | إضافة فاصلة بين العناصر |
| 6 | قوس/قوس مغلق مفقود | [ أو { غير مغلق | إضافة الحرف المغلق المفقود |
| 7 | undefined / NaN / Infinity | قيم خاصة بـ JS في JSON | استبدالها بـ null أو سلسلة |
| 8 | فاصلة زائدة في المصفوفة | فاصلة زائدة في المصفوفة | إزالة الفاصلة الزائدة |
| 9 | علامات اقتباس ذكية | علامات اقتباس من Word/Slack | استبدالها بعلامات اقتباس مزدوجة مستقيمة |
| 10 | حرف BOM | U+FEFF غير مرئي في بداية الملف | إعادة الحفظ كـ UTF-8 بدون BOM |
منع أخطاء JSON
إصلاح الأخطاء أمر جيد. عدم إنشائها في المقام الأول أفضل. إليك العادات التي تحافظ على نظافة JSON:
- لا تكتب JSON يدويًا أبدًا. قم بتوليده من الكود باستخدام
JSON.stringifyأو ما يعادلها في لغتك. تنتج أدوات التسلسل JSON صالحًا بالتعريف. - استخدم محررًا يدرك JSON. يبرز VS Code وJetBrains IDEs وSublime Text جميع أخطاء بناء جملة JSON في الوقت الفعلي. إذا رأيت خطًا أحمر متعرجًا، قم بإصلاحه قبل الحفظ.
- تحقق في CI. أضف خطوة تحقق إلى خط بناءك تقوم بتحليل جميع ملفات JSON وتفشل عند وجود أخطاء. سطر واحد من سكربت الشل يفعل ذلك:
find . -name "*.json" -exec python -m json.tool {} \\; - استخدم JSONC للتكوين. إذا كنت بحاجة إلى تعليقات، استخدم JSONC (امتداد
.jsonc) حيثما كان ذلك مدعومًا. تتعامل TypeScript وVS Code والعديد من الأدوات الأخرى معه بشكل أصلي.
متى تستخدم الإصلاح التلقائي
أحيانًا يكون JSON الذي تتلقاه خارج نطاق سيطرتك - استجابة API من خدمة سيئة البناء، أو ملف تم تصديره بواسطة برنامج قديم، أو جزء تم لصقه بواسطة عضو في فريق غير تقني. في هذه الحالات، يكون الإصلاح اليدوي مملًا وعرضة للأخطاء.
يمكن لأدوات الإصلاح التلقائي إصلاح معظم الأخطاء المذكورة أعلاه في تمريرة واحدة. تقوم بتحليل الإدخال المكسور، وتستنتج الهيكل المقصود، وتنتج JSON صالحًا. يعمل هذا بشكل جيد مع المشكلات الشائعة مثل الفواصل الزائدة، وعلامات الاقتباس المفردة، والمفاتيح غير المحاطة بعلامات اقتباس.
التجارة هي أن الإصلاح التلقائي يقوم بعمل افتراضات. إذا كان JSON مشوهًا بشكل سيء - مفقود أجزاء كبيرة أو غامض هيكليًا - قد يخمن الأداة بشكل خاطئ. تحقق دائمًا من المخرجات المصححة قبل استخدامها في الإنتاج.
جرب بنفسك: ألصق JSON مكسور في أداتنا إصلاح JSON لإصلاح الأخطاء الشائعة تلقائيًا، أو استخدم مدقق JSON لتحديد مكان المشكلة بالضبط.