مساعدة تقنية

لماذا يقول JSON.parse "Unexpected token"؟

يرمي JSON.parse خطأ Unexpected token عندما لا يكون النص JSON صالحاً. نقّح الاقتباس المفرد والفواصل الزائدة واستجابات HTML وموضع الخطأ.

جواب سريع

يرمي JSON.parse() خطأ SyntaxError عندما لا تكون المدخلات JSON صالحاً. «Unexpected token» يعني عموماً أن المحلّل وصل إلى محرف غير مسموح في تلك النقطة من البنية.

تشمل الأسباب الشائعة الاقتباس المفرد، والفواصل الزائدة، وأسماء الخصائص بلا اقتباس، وتهريب السلاسل الخاطئ، والنص الزائد حول JSON، أو تحليل HTML أو جسم غير JSON كما لو كان JSON.

صياغة الخطأ الدقيقة تختلف حسب محرك JavaScript والمتصفح. لا تفترض أن كل بيئة تشغيل تطبع «Unexpected token X in JSON at position N».

هذا تشخيص Unexpected token في JSON.parse: معنى الخطأ، وكيفية قراءة الموضع، وما العمل عندما يكون الجسم HTML. تغطية أوسع للفواصل الزائدة والاقتباس وUnexpected end في أخطاء JSON الشائعة: الفاصلة الزائدة والاقتباس وUnexpected token.

ماذا يعني “Unexpected token” في JSON.parse()؟

يتطلب JSON.parse() نحو JSON. محرف غير قانوني في الموضع الحالي يرمي SyntaxError. {“name”:“Alex”,} غير صالح: بعد تلك الفاصلة لا يمكن أن ينتهي الكائن. نص الرسالة والموضع ما زالا يختلفان حسب بيئة التشغيل.

أي خطأ يرميه JSON.parse()؟

JSON غير الصالح يرمي عموماً SyntaxError. سجّل error.name لتأكيد النوع. لا تثبّت error.message بالكامل: المحركات والإصدارات تصوغه بشكل مختلف.

try {
  JSON.parse('{"name":"Alex",}');
} catch (error) {
  console.log(error.name);
  // SyntaxError
}

1. استخدام الاقتباس المفرد بدل الاقتباس المزدوج

{‘name’:‘Alex’} JSON غير صالح. {“name”:“Alex”} صالح. سلاسل JSON وأسماء أعضاء الكائن تستخدم اقتباساً مزدوجاً. حرفية كائن JavaScript مثل const user = { name: ‘Alex’ } قد تكون JavaScript قانونية ومع ذلك ليست نص JSON.

غير صالح

{'name':'Alex'}

صالح

{"name":"Alex"}

2. الفواصل الزائدة

فاصلة بعد آخر خاصية أو عنصر مصفوفة ليست JSON قياسياً صالحاً. {“name”:“Alex”,“age”:30,} و [1, 2, 3,] يفشلان. عاملها كسبب لـ Unexpected token؛ أخطاء JSON الشائعة: الفاصلة الزائدة والاقتباس وUnexpected token يغطي الفواصل الزائدة بعمق أكبر.

غير صالح

{
  "name": "Alex",
  "age": 30,
}

صالح

{
  "name": "Alex",
  "age": 30
}
[1, 2, 3,]

3. أسماء خصائص بلا اقتباس

{ name: “Alex” } قد تكون حرفية كائن JavaScript. في JSON، أسماء الأعضاء سلاسل وتحتاج اقتباساً مزدوجاً: {“name”:“Alex”}.

غير صالح

{
  name: "Alex"
}

صالح

{
  "name": "Alex"
}

4. تهريب سلسلة غير صالح

في نص JSON تبدأ الشرطة المائلة العكسية تهريباً. مسار خام مثل C:\Users\Alex غير صالح لأن \U ليس تهريباً قانونياً. ضاعف الشرط المائلة العكسية. لا تخلط تهريب لغة المضيف بتهريب JSON. أخطاء JSON الشائعة: الفاصلة الزائدة والاقتباس وUnexpected token يغطي هذا بعمق أكبر.

غير صالح

{"file":"C:\Users\Alex"}

صالح

{"file":"C:\\Users\\Alex"}

5. نص زائد قبل JSON أو بعده

يتوقع JSON.parse قيمة JSON واحدة. بادئة مثل Success: قبل {“ok”:true}، أو لاحقة مثل done بعده، تجعل السلسلة كلها غير صالحة. المسافات البيضاء غير المهمة حول قيمة JSON واحدة مسموحة. JSON لا يُمنع من وجود مسافات قبل القيمة أو بعدها.

Success:
{"ok":true}
{"ok":true}
done

6. تحليل HTML بدل JSON

استدعاء response.json() على صفحة HTML حالة شائعة لـ Unexpected token. النقاط النهائية الخاطئة، وصفحات HTML لـ 404 أو 500، وإعادة توجيه تسجيل الدخول، وأجسام الوكيل، وصفحات الاحتياط غالباً تبدأ بترميز. «Unexpected token < يعني دائماً HTML» أقوى مما ينبغي: < دليل، لا إثبات.

fetch('/api/data')
  .then(response => response.json())

ماذا يعني عادةً “Unexpected token <”؟

قيم JSON لا تبدأ عادةً بـ <. إذا بدأ الجسم بـ أو ، فقد يكون < أول محرف غير قانوني. أثناء التنقيح المحلي، افحص حالة HTTP وContent-Type والجسم الخام. صياغة المحرك ما زالت تختلف.

افحص الاستجابة قبل تحليلها

يمكن استهلاك جسم fetch مرة واحدة فقط. أثناء التنقيح المحلي، اقرأ text() أولاً، افحص بادئة قصيرة، ثم طبّق JSON.parse على السلسلة نفسها. لا تستدعِ response.json() ثم response.text() على الاستجابة نفسها. لا تسجّل حمولات إنتاج حسّاسة افتراضياً.

const response = await fetch(url);
const text = await response.text();

console.log(response.status);
console.log(response.headers.get("content-type"));
console.log(text.slice(0, 200));

try {
  const data = JSON.parse(text);
  console.log(data);
} catch (error) {
  console.error("Invalid JSON:", error);
}

ماذا يعني “at position 123”؟

بعض المحركات تبلّغ عن موضع أو سطر أو عمود. انظر قربها اقتباساً أو فاصلة أو قوساً أو تهريباً سيئاً. ذلك الفهرس حيث لاحظ التحليل مشكلة؛ السبب الحقيقي قد يكون أسبق. ليس مضموناً أنه المحرف المعيب بالضبط.

Unexpected token مقابل Unexpected end

Unexpected token يعني أن المحلّل واجه محرفاً لم يتوقعه. قد يظهر Unexpected end عندما تتوقف المدخلات قبل اكتمال القيمة، كما في {“name”:“Alex” بلا قوس إغلاق. الصياغة الدقيقة تعتمد على المحرك. أخطاء JSON الشائعة: الفاصلة الزائدة والاقتباس وUnexpected token يغطي JSON غير المكتمل على نطاق أوسع.

{"name":"Alex"

JSON ليس حرفية كائن JavaScript نفسها

JSON تنسيق بيانات. حرفية كائن JavaScript نحو JavaScript. كائن JS بمفاتيح بلا اقتباس واقتباس مفرد وفاصلة زائدة ليس نص JSON صالحاً. لا يستطيع JSON.parse تحليل حرفيات كائن JavaScript بأمان.

const data = {
  name: 'Alex',
  active: true,
};
{
  "name": "Alex",
  "active": true
}

هل يمكن أن يحتوي JSON على تعليقات؟

JSON القياسي لا يدعم التعليقات. سطر // داخل كائن غير صالح. JSON5 وامتدادات مشابهة تنسيقات مختلفة. يتحقق تنسيق JSON والمقارنة من JSON القياسي بـ JSON.parse ولا يعامل JSON5 كـ JSON.

{
  // user name
  "name": "Alex"
}

هل undefined وNaN وInfinity قيم JSON صالحة؟

لا. قيم JSON هي كائن ومصفوفة وسلسلة وعدد وtrue وfalse وnull. undefined وNaN وInfinity ليست كذلك. قيمة المستوى الأعلى لا يلزم أن تكون كائناً أو مصفوفة: true و123 و“hello” وnull JSON صالح.

{"a":undefined}
{"a":NaN}
{"a":Infinity}
true
123
"hello"
null

كيف تصلح خطأ Unexpected token خطوة بخطوة

اعمل على المصدر، لا على سلسلة الخطأ:

  1. أكد أن المدخلات JSON فعلاً، لا HTML أو سجلات أو JavaScript.
  2. افحص المحارف الأولى من المدخلات الخام.
  3. إن جاءت من API، افحص حالة HTTP وContent-Type. لا 200 ولا application/json يضمنان JSON صالحاً.
  4. تحقق من النحو في محلّل JSON.
  5. استخدم أي موضع أو سطر أو عمود مبلّغ عنه كدليل، لا كسبب جذري مضمون.
  6. افحص الاقتباس والفواصل والأقواس المعقوفة والمربوطة والتهريب قرب تلك المنطقة.
  7. قارن بنسخة منسّقة ومتحقَّق منها.
  8. أصلح المسلسِل أو نقطة النهاية. لا تحذف الرمز المبلّغ عنه عشوائياً.
لا «تصلح» JSON باستبدال الاقتباس عشوائياً

استبدال عام لـ ' بـ " قد يكسر الفواصل العليا داخل السلاسل، والنص المهرَّب مسبقاً، والمصادر غير JSON. أنتج JSON صالحاً من المسلسِل الحقيقي. لا تعامل eval كمحلّل JSON.

استخدم JSON.stringify() عند إنتاج JSON في JavaScript

فضّل JSON.stringify على لصق السلاسل يدوياً. يُصدر نص JSON صالحاً للقيم التي يسلسلها. لا يحفظ كل قيمة JavaScript: undefined والدوال والرموز لها سلوك خاص. ذلك التفصيل خارج النطاق هنا.

const data = {
  name: "Alex",
  active: true
};
const json = JSON.stringify(data);
// {"name":"Alex","active":true}

JSON غير صالح مقابل إصلاح حقيقي

دُققت هذه الأزواج بـ JSON.parse. لـ HTML، الإصلاح هو الاستجابة، لا تعديل النحو.

المشكلة غير صالح الإصلاح
اقتباس مفرد {'a':1} {"a":1}
فاصلة زائدة {"a":1,} {"a":1}
مفتاح بلا اقتباس {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
جسم HTML <html>... افحص نقطة النهاية والاستجابة الخام. لا تحوّل HTML إلى JSON بالتحرير.

دليل قرار بسيط لـ Unexpected token

إذا فشل JSON.parse، قرر أولاً إن كان لديك JSON أصلاً قبل إعادة كتابة الاقتباس.

  • فشل JSON.parse
  • من API؟ افحص الحالة وContent-Type والجسم الخام
  • هل يبدأ كـ JSON؟ إن لم يكن، أصلح المصدر أو نقطة النهاية
  • إن نعم، تحقق من الاقتباس والفواصل والأقواس والتهريب والقيم غير المدعومة
  • استخدم الموضع المبلّغ عنه كدليل
  • أصلح المصدر ثم حلّل مجدداً
Unexpected token يسمّي المفاجأة. مصدر النص غالباً هو الإصلاح الحقيقي.

تحقق من JSON قبل تحليله أو استخدامه

NEXNARA تنسيق JSON والمقارنة يتحقق من JSON في المتصفح بـ JSON.parse—وليس eval.

تحقق، نسّق بمسافتين أو 4 مسافات أو علامات جدولة، صغّر، انسخ، نزّل، وارفع .json. يغطي JSON Diff الكائنات والمصفوفات المتداخلة والمسارات والملخص والمرشحات والتبديل. بعد التحليل، النسخ المنسّقة والمصغَّرة لنفس البيانات تُقارن متساوية؛ تُقارن مفاتيح الكائن بالاسم.

النص الأكبر من 5 MB قد يبدو بطيئاً. النص الأكبر من 15 MB لا يُعالَج في المتصفح.

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

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

FAQ

لماذا يقول JSON.parse Unexpected token؟

النص ليس JSON صالحاً عند النقطة التي توقف فيها المحلّل. الأسباب النموذجية: الاقتباس، والفواصل، والنص الزائد، أو جسم غير JSON مثل HTML.

ماذا يعني Unexpected token < in JSON؟

قد يكون أول محرف غير قانوني <. ذلك يشير غالباً إلى صفحة HTML، لكنه ليس إثباتاً لـ 404 أو لـ HTML في كل حالة. افحص الحالة وContent-Type والجسم الخام.

كيف أجد موضع الخطأ في JSON؟

إذا بلّغ المحرك عن موضع أو سطر أو عمود، انظر قربها. الخطأ الحقيقي قد يكون أسبق. استخدمه كدليل ثم تحقق.

هل يمكن أن يستخدم JSON اقتباساً مفرداً؟

لا. سلاسل JSON القياسي وأسماء الأعضاء تستخدم اقتباساً مزدوجاً.

هل يمكن أن يحتوي JSON على فواصل زائدة؟

لا. JSON القياسي لا يسمح بفاصلة بعد آخر خاصية أو عنصر مصفوفة.

كيف أتحقق إن كانت سلسلة JSON صالحاً؟

استدعِ JSON.parse داخل try/catch، أو الصق النص في تنسيق JSON والمقارنة. إذا رمى التحليل SyntaxError، فالسلسلة ليست JSON صالحاً.

مساعدة تقنية

أخطاء JSON الشائعة: الفاصلة الزائدة والاقتباس وUnexpected token

أصلح JSON غير الصالح: الفاصلة الزائدة، الاقتباس المفرد، المفاتيح بلا اقتباس، وUnexpected token. اعرف لماذا يفشل JSON.parse وكيف تتحقق من JSON.

مساعدة تقنية

JPG مقابل PNG للقطات الشاشة: أيهما أصغر؟

اختر JPG أو PNG للقطة حسب المحتوى: UI والنص غالباً يبقيان أحدّ كـPNG؛ الإطارات الغنية بالصور قد تصغر كـJPEG.

مساعدة تقنية

كيف تصغّر حجم ملف الصورة دون أن تصبح ضبابية

قلّل حجم ملف الصورة الفوتوغرافية والصورة مع الإبقاء على جودة بصرية مقبولة. غيّر الأبعاد المفرطة أولاً، ثم اضغط باعتدال، ثم اختر صيغة مناسبة.

مساعدة تقنية

من Unix Timestamp إلى التاريخ: الثواني والميلي ثانية وUTC مشروحة

حوّل Unix timestamp إلى تاريخ. انظر الثواني مقابل الميلي ثانية، UTC مقابل الوقت المحلي، ISO 8601، وكيف تعيد التاريخ إلى زمن epoch.

مساعدة تقنية

لماذا يجعل Base64 الملفات أكبر؟

Base64 يجعل البيانات الثنائية أكبر بنحو الثلث عادة. انظر بنية 3 بايتات إلى 4 محارف، والحشو، وزيادة Data URL، ومتى يستحق الحجم الإضافي.