Tech Help
Защо 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 след него, прави целия низ невалиден. Незначителен whitespace около една JSON стойност е позволен. JSON не забранява интервали преди или след стойността.
Success:
{"ok":true}
{"ok":true}
done
6. Разбор на HTML вместо JSON
Извикването на response.json() върху HTML страница е често срещан случай на Unexpected token. Грешни endpoints, 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"
}
Валиден JSON ли са undefined, NaN и Infinity?
Не. 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.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>... |
Проверете endpoint и суровия отговор. Не редактирайте HTML в JSON. |
Просто ръководство за решение при Unexpected token
Ако JSON.parse се провали, решете дали изобщо имате JSON, преди да преписвате кавички.
- JSON.parse се провали
- От API? Проверете статус, Content-Type и суровото тяло
- Започва ли като JSON? Ако не, поправете източника или endpoint
- Ако да, валидирайте кавички, запетаи, скоби, квадратни скоби, екраниране, неподдържани стойности
- Използвайте съобщената позиция като подсказка
- Поправете източника и разберете отново
Валидирайте JSON преди разбор или използване
NEXNARA Форматиране и сравнение на JSON валидира JSON в браузъра с JSON.parse—не eval.
Валидиране, подреждане с 2 интервала, 4 интервала или табулация, minify, копиране, изтегляне и качване на .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.