راهنمای فنی
چرا JSON.parse میگوید "Unexpected token"؟
JSON.parse وقتی متن JSON معتبر نیست Unexpected token پرتاب میکند. گیومهٔ تکی، ویرگول انتهایی، پاسخ HTML و موقعیت خطا را عیبیابی کنید.
JSON.parse() وقتی ورودی JSON معتبر نیست SyntaxError پرتاب میکند. «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 است. endpoint غلط، صفحهٔ 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 را گامبهگام درست کنیم
روی منبع کار کنید، نه روی رشتهٔ خطا:
- تأیید کنید ورودی واقعاً JSON است، نه HTML یا گزارش یا JavaScript.
- نویسههای نخست ورودی خام را ببینید.
- اگر از API آمده، وضعیت HTTP و Content-Type را ببینید. نه 200 و نه application/json JSON معتبر را تضمین نمیکنند.
- نحو را در یک تجزیهگر JSON بسنجید.
- هر موقعیت، خط یا ستون گزارششده را سرنخ بدانید، نه علت ریشهای تضمینی.
- نزدیک آن ناحیه گیومه، ویرگول، ابرو، کروشه و گریز را بررسی کنید.
- با رونوشت قالببندیشده و سنجیدهشده مقایسه کنید.
- سریالساز یا endpoint را درست کنید. رمز گزارششده را تصادفی پاک نکنید.
جایگزینی سراسری ' با " میتواند آپاستروف داخل رشته، متن ازپیشگریخته و منبع غیر JSON را بشکند. JSON معتبر را از سریالساز واقعی بسازید. eval را تجزیهگر JSON ندانید.
هنگام ساخت JSON در JavaScript از JSON.stringify() استفاده کنید
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>... |
endpoint و پاسخ خام را ببینید. HTML را با ویرایش به JSON تبدیل نکنید. |
راهنمای تصمیم ساده برای Unexpected token
اگر JSON.parse شکست خورد، پیش از بازنویسی گیومه تصمیم بگیرید اصلاً JSON دارید یا نه.
- JSON.parse شکست خورد
- از API؟ وضعیت، Content-Type و بدنهٔ خام را ببینید
- با JSON شروع میشود؟ اگر نه، منبع یا endpoint را درست کنید
- اگر آری، گیومه، ویرگول، ابرو، کروشه، گریز، مقدارهای پشتیبانینشده را بسنجید
- موقعیت گزارششده را سرنخ بدانید
- منبع را درست کنید، سپس دوباره تجزیه کنید
JSON را پیش از تجزیه یا استفاده بسنجید
NEXNARA قالببندی و مقایسه JSON JSON را در مرورگر با JSON.parse میسنجد—نه با eval.
بسنجید، با ۲ فاصله، ۴ فاصله یا تب زیبا چاپ کنید، کوچک کنید، رونویسی کنید، بارگیری و بارگذاری .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 معتبر نیست.