Tech Help

Af hverju segir JSON.parse "Unexpected token"?

JSON.parse kastar Unexpected token þegar textinn er ekki gilt JSON. Kemba einfaldar gæsalappir, kommur að lokum, HTML-svör og villustöðu.

Fljótlegt svar

JSON.parse() kastar SyntaxError þegar inntakið er ekki gilt JSON. „Unexpected token“ þýðir almennt að þáttarinn náði staf sem er ekki leyfður á þeim punkti í byggingunni.

Algengar orsakir eru einfaldar gæsalappir, kommur að lokum, eigindanöfn án gæsalappa, slæmt escape á streng, auka texti umhverfis JSON, eða þáttun HTML eða annars líkama sem er ekki JSON sem JSON.

Nákvæm orðalag villunnar er mismunandi eftir JavaScript-vél og vafra. Ekki gera ráð fyrir að hvert keyrsluumhverfi prenti „Unexpected token X in JSON at position N“.

Þetta er kembing Unexpected token í JSON.parse: hvað villan þýðir, hvernig á að lesa stöðu og hvað á að gera þegar líkaminn er HTML. Víðari umfjöllun um kommur að lokum, gæsalappir og Unexpected end er í Algengar JSON-villur: kommu að lokum, gæsalappir og Unexpected token.

Hvað þýðir “Unexpected token” í JSON.parse()?

JSON.parse() krefst JSON-málfræði. Ólöglegur stafur á núverandi stöðu kastar SyntaxError. {“name”:“Alex”,} er ógilt: eftir þá kommu má hluturinn ekki enda. Texti skilaboða og staða eru enn mismunandi eftir runtime.

Hvaða villu kastar JSON.parse()?

Ógilt JSON kastar almennt SyntaxError. Skráðu error.name til að staðfesta gerðina. Ekki harðkóða allan error.message: vélar og útgáfur orða hann öðruvísi.

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

1. Notkun einfaldra gæsalappa í stað tvöfaldra

{‘name’:‘Alex’} er ógilt JSON. {“name”:“Alex”} er gilt. JSON-strengir og nöfn meðlima hlutar nota tvöfaldar gæsalappir. JavaScript-hlutabókstafur eins og const user = { name: ‘Alex’ } getur verið löglegt JavaScript og samt ekki JSON-texti.

Ógilt

{'name':'Alex'}

Gilt

{"name":"Alex"}

2. Kommur að lokum

Komma eftir síðustu eigind eða fylkisatriði er ekki gilt staðlað JSON. {“name”:“Alex”,“age”:30,} og [1, 2, 3,] mistakast bæði. Meðhöndlið þetta sem eina orsök Unexpected token; Algengar JSON-villur: kommu að lokum, gæsalappir og Unexpected token fjallar dýpra um kommur að lokum.

Ógilt

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

Gilt

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

3. Eigindanöfn án gæsalappa

{ name: “Alex” } getur verið JavaScript-hlutabókstafur. Í JSON eru nöfn meðlima hlutar strengir og þurfa tvöfaldar gæsalappir: {“name”:“Alex”}.

Ógilt

{
  name: "Alex"
}

Gilt

{
  "name": "Alex"
}

4. Ógilt escape á streng

Í JSON-texta byrjar öfugt skástrik escape. Óunnin slóð eins og C:\Users\Alex er ógild vegna þess að \U er ekki löglegt escape. Tvöfaldið öfugu skástrikin. Ekki blanda escape gistimálsins við JSON-escape. Algengar JSON-villur: kommu að lokum, gæsalappir og Unexpected token fjallar dýpra um þetta.

Ógilt

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

Gilt

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

5. Auka texti fyrir framan eða á eftir JSON

JSON.parse væntir eins JSON-gildis. Forskeyti eins og Success: fyrir framan {“ok”:true}, eða viðskeyti eins og done á eftir, gerir allan strenginn ógildan. Óverulegt bil umhverfis eitt JSON-gildi er leyft. JSON bannar ekki bil fyrir framan eða á eftir gildinu.

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

6. Þáttun HTML í stað JSON

Kall á response.json() á HTML-síðu er algengt Unexpected token tilvik. Rangir endpointar, 404 eða 500 HTML-síður, innskráningarendurbeiningar, milliliðalíkami og varasíður byrja oft á merkingum. „Unexpected token < þýðir alltaf HTML“ er of sterkt: < er vísbending, ekki sönnun.

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

Hvað þýðir “Unexpected token <” venjulega?

JSON-gildi byrja venjulega ekki á <. Ef líkaminn byrjar á eða getur < verið fyrsti ólöglegi stafurinn. Við staðbundna kembingu skoðið HTTP-stöðu, Content-Type og óunna líkamann. Orðalag vélarinnar er enn mismunandi.

Skoðið svarið áður en þið þáttið það

fetch-líkaminn má aðeins nota einu sinni. Við staðbundna kembingu lesið text() fyrst, skoðið stutt forskeyti, síðan JSON.parse sama streng. Ekki kalla response.json() og síðan response.text() á sama svari. Ekki skrá viðkvæmar framleiðslufarmir sjálfgefið.

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);
}

Hvað þýðir “at position 123”?

Sumar vélar tilkynna stöðu, línu eða dálk. Leitið nálægt slæmra gæsalappa, kommu, sviga eða escape. Sá vísir er þar sem þáttunin tók eftir vandamáli; raunveruleg orsök getur verið fyrr. Það er ekki tryggt að það sé nákvæmlega bilaði stafurinn.

Unexpected token á móti Unexpected end

Unexpected token þýðir að þáttarinn hitti staf sem hann bjóst ekki við. Unexpected end getur birst þegar inntak stöðvast áður en gildið er fullkomið, eins og í {“name”:“Alex” án lokandi slaufusviga. Nákvæmt orðalag fer eftir vélinni. Algengar JSON-villur: kommu að lokum, gæsalappir og Unexpected token fjallar víðar um ófullkomið JSON.

{"name":"Alex"

JSON er ekki það sama og JavaScript-hlutabókstafur

JSON er gagnasnið. JavaScript-hlutabókstafur er JavaScript-setningafræði. JS-hluturinn með lyklum án gæsalappa, einföldum gæsalöppum og kommu að lokum er ekki gildur JSON-texti. JSON.parse getur ekki þátt JavaScript-hlutabókstafi örugglega.

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

Getur JSON innihaldið athugasemdir?

Staðlað JSON styður ekki athugasemdir. Lína // inni í hlut er ógild. JSON5 og svipaðar viðbætur eru önnur snið. Sniða og bera saman JSON sannreynir staðlað JSON með JSON.parse og meðhöndlar ekki JSON5 sem JSON.

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

Eru undefined, NaN og Infinity gilt JSON?

Nei. JSON-gildi eru hlutur, fylki, strengur, tala, true, false og null. undefined, NaN og Infinity eru það ekki. Gildi á efsta stigi þarf ekki að vera hlutur eða fylki: true, 123, “hello” og null eru gilt JSON.

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

Hvernig á að laga Unexpected token villu skref fyrir skref

Vinnið uppsprettuna, ekki villustrenginn:

  1. Staðfestið að inntakið sé raunverulega JSON, ekki HTML, annálar eða JavaScript.
  2. Skoðið fyrstu stafi óunna inntaksins.
  3. Ef það kom frá API, athugið HTTP-stöðu og Content-Type. Hvorki 200 né application/json ábyrgjast gilt JSON.
  4. Sannreynið setningafræðina í JSON-þáttara.
  5. Notið tilkynnta stöðu, línu eða dálk sem vísbendingu, ekki sem ábyrgða rót vandans.
  6. Athugið gæsalappir, kommur, slaufusviga, hornsviga og escape nálægt því svæði.
  7. Berið saman við sniðna, sannreynda afritun.
  8. Lagið raðara eða endpoint. Ekki eyða tilkynnta tákninu af handahófi.
Ekki „laga“ JSON með því að skipta gæsalöppum af handahófi

Alheimsstaðgengill ' með " getur brotið frádráttarmerki inni í strengjum, þegar escapeaðan texta og uppsprettur sem eru ekki JSON. Framleiðið gilt JSON frá raunverulega raðaranum. Ekki meðhöndla eval sem JSON-þáttara.

Notið JSON.stringify() þegar þið framleiðið JSON í JavaScript

Kjósið JSON.stringify fremur en að tengja strengi í höndunum. Það gefur frá sér gildan JSON-texta fyrir gildin sem það raðar. Það varðveitir ekki hvert JavaScript-gildi: undefined, föll og tákn hafa sérstaka hegðun. Sú smáatriði er utan sviðs hér.

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

Ógilt JSON á móti raunverulegri lagfæringu

Þessi pör voru athuguð með JSON.parse. Fyrir HTML er lagfæringin svarið, ekki setningafræðibreyting.

Vandamál Ógilt Lagfæring
Einfaldar gæsalappir {'a':1} {"a":1}
Komma að lokum {"a":1,} {"a":1}
Lykill án gæsalappa {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
HTML-líkami <html>... Athugið endpoint og óunna svarið. Ekki breyta HTML í JSON.

Einföld ákvarðanaleiðbeining fyrir Unexpected token

Ef JSON.parse mistókst, ákveðið hvort þið hafið yfirleitt JSON áður en þið endurskrifið gæsalappir.

  • JSON.parse mistókst
  • Frá API? Athugið stöðu, Content-Type og óunna líkamann
  • Byrjar það sem JSON? Ef ekki, lagið uppsprettu eða endpoint
  • Ef já, sannreynið gæsalappir, kommur, slaufusviga, hornsviga, escape, óstudd gildi
  • Notið tilkynnta stöðu sem vísbendingu
  • Lagið uppsprettuna, síðan þáttið aftur
Unexpected token nefnir undrunina. Uppspretta textans er oft raunverulega lagfæringin.

Sannreynið JSON áður en þið þáttið eða notið það

NEXNARA Sniða og bera saman JSON sannreynir JSON í vafranum með JSON.parse—ekki eval.

Sannprófun, fallegt snið með 2 bilum, 4 bilum eða dálkabilum, minify, afritun, niðurhal og upphleðsla .json. JSON Diff nær yfir hreiðraða hluti og fylki, slóðir, samantekt, síur og skipti. Eftir þáttun bera fallegt og minify afrit sömu gagna saman sem jöfn; hlutalyklar eru bornir saman eftir nafni.

Texti stærri en 5 MB getur fundist hægur. Texti stærri en 15 MB er ekki unninn í vafranum.

JSON-sannprófun og snið gerast í vafranum þínum. Þetta tól sendir ekki JSON á NEXNARA-þjón. Auglýsingar og aðrir eiginleikar vefsins nota samt netið.

Límdu strenginn sem mistakast í Sniða og bera saman JSON og lestu fyrstu stafina áður en þú endurskrifar gæsalappir.

FAQ

Af hverju segir JSON.parse Unexpected token?

Textinn er ekki gilt JSON á punktinum þar sem þáttarinn stöðvaðist. Dæmigerðar orsakir eru gæsalappir, kommur, auka texti eða líkami sem er ekki JSON, eins og HTML.

Hvað þýðir Unexpected token < in JSON?

Fyrsti ólöglegi stafurinn getur verið <. Það bendir oft á HTML-síðu, en er ekki sönnun um 404 né HTML í hverju tilviki. Athugið stöðu, Content-Type og óunna líkamann.

Hvernig finn ég villustöðu í JSON?

Ef vélin tilkynnir stöðu, línu eða dálk, horfið nálægt. Raunverulega villan getur verið fyrr. Notið sem vísbendingu, síðan sannreynið.

Getur JSON notað einfaldar gæsalappir?

Nei. Í stöðluðu JSON nota strengir og meðlimanöfn tvöfaldar gæsalappir.

Getur JSON haft kommur að lokum?

Nei. Staðlað JSON leyfir ekki kommu eftir síðustu eigind eða fylkisatriði.

Hvernig athuga ég hvort strengur sé gilt JSON?

Kallið JSON.parse í try/catch, eða límið textann í Sniða og bera saman JSON. Ef þáttun kastar SyntaxError er strengurinn ekki gilt JSON.