Tech Help
Зошто JSON.parse вели "Unexpected token"?
JSON.parse фрла Unexpected token кога текстот не е валиден JSON. Отстранете единечни наводници, завршни запирки, HTML одговори и позицијата на грешката.
JSON.parse() фрла SyntaxError кога влезот не е валиден JSON. „Unexpected token“ обично значи дека парсерот стигнал до знак што на тоа место во структурата не е дозволен.
Чести причини се единечни наводници, завршни запирки, имиња на својства без наводници, лош escape на ниска, дополнителен текст околу 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”,} е невалидно: по таа запирка објектот не смее да заврши. Текстот на пораката и позицијата сè уште се разликуваат според runtime.
Која грешка ја фрла 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. Невалиден escape на ниска
Во JSON текстот обратната коса црта започнува escape. Сурова патека како C:\Users\Alex е невалидна бидејќи \U не е законит escape. Удвојте ги обратните црти. Не мешајте го escape на јазикот-домаќин со JSON escape. Чести 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”?
Некои мотори пријавуваат позиција, ред или колона. Побарајте во близина лош наводник, запирка, заграда или escape. Тој индекс е каде парсирањето забележало проблем; вистинската причина може да биде порано. Не е загарантирано дека тоа е точно расипаниот знак.
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 парсер.
- Пријавената позиција, ред или колона користете ја како трага, не како загарантиран корен на проблемот.
- Проверете наводници, запирки, виткасти загради, аглести загради и escape во близина на таа зона.
- Споредете со форматирана, проверена копија.
- Поправете го серијализаторот или endpoint. Не го бришете пријавениот токен на слепо.
Глобална замена на ' со " може да скрши апострофи внатре во ниски, веќе escape-уван текст и извори што не се JSON. Произведете валиден JSON од вистинскиот серијализатор. Не третирајте eval како JSON парсер.
Користете JSON.stringify() кога во JavaScript произведувате JSON
Пожелно 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
- Ако да, проверете наводници, запирки, виткасти загради, аглести загради, escape, неподдржани вредности
- Пријавената позиција користете ја како трага
- Поправете го изворот, па парсирајте повторно
Проверете JSON пред парсирање или користење
NEXNARA Форматирање и споредба на JSON проверува JSON во прелистувачот со JSON.parse—не eval.
Проверка, убаво форматирање со 2 празни места, 4 празни места или табулатори, minify, копирање, преземање и прикачување .json. JSON Diff покрива вгнездени објекти и низи, патеки, резиме, филтри и замена. По парсирање, убаво форматираната и minify копија на истите податоци се споредуваат како еднакви; клучевите на објектот се споредуваат по име.
Текст поголем од 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.