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

Работете на изворот, не на ниската на грешката:

  1. Потврдете дека влезот навистина е JSON, а не HTML, дневници или JavaScript.
  2. Прегледајте ги првите знаци на суровиот влез.
  3. Ако дошол од API, проверете го HTTP статусот и Content-Type. Ниту 200 ниту application/json не гарантираат валиден JSON.
  4. Проверете ја синтаксата во JSON парсер.
  5. Пријавената позиција, ред или колона користете ја како трага, не како загарантиран корен на проблемот.
  6. Проверете наводници, запирки, виткасти загради, аглести загради и escape во близина на таа зона.
  7. Споредете со форматирана, проверена копија.
  8. Поправете го серијализаторот или endpoint. Не го бришете пријавениот токен на слепо.
Не „поправајте“ JSON со случајна замена на наводници

Глобална замена на ' со " може да скрши апострофи внатре во ниски, веќе 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, неподдржани вредности
  • Пријавената позиција користете ја како трага
  • Поправете го изворот, па парсирајте повторно
Unexpected token го именува изненадувањето. Изворот на текстот често е вистинската поправка.

Проверете 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.

Tech Help

Чести JSON грешки: завршна запирка, наводници и Unexpected token

Поправете невалиден JSON: завршна запирка, единечни наводници, клучеви без наводници и Unexpected token. Зошто JSON.parse паѓа и како да проверите JSON.

Tech Help

JPG vs PNG за снимки од екран: кој е помал?

Изберете JPG или PNG за снимки од екран според содржината: интерфејсот и текстот почесто остануваат поостри како PNG; кадри полни со фотографии може да бидат помали како JPEG.

Tech Help

Како да ја намалите големината на сликата без да стане замаглена

Намалете ја големината на фотографии и слики со прифатлив визуелен квалитет. Прво намалете ги преголемите димензии, потоа умерено компресирајте, потоа изберете соодветен формат.

Tech Help

Unix Timestamp во датум: секунди, милисекунди и UTC објаснети

Претворете Unix timestamp во датум. Погледнете секунди наспроти милисекунди, UTC наспроти локално време, ISO 8601 и како датумот се враќа во epoch време.

Tech Help

Зошто Base64 ги зголемува датотеките?

Base64 обично ги зголемува бинарните податоци за околу една третина. Погледнете ја структурата 3 бајти во 4 знаци, дополнувањето, трошокот на Data URL и кога дополнителната големина вреди.