Tech Help

Kodėl JSON.parse sako "Unexpected token"?

JSON.parse meta Unexpected token, kai tekstas nėra teisingas JSON. Derinkite viengubas kabutes, gale esančius kablelius, HTML atsakymus ir klaidos poziciją.

Greitas atsakymas

JSON.parse() meta SyntaxError, kai įvestis nėra teisingas JSON. „Unexpected token“ paprastai reiškia, kad analizatorius pasiekė ženklą, kuris toje struktūros vietoje neleidžiamas.

Dažnos priežastys: viengubos kabutės, gale esantys kableliai, savybių vardai be kabučių, blogas eilutės escape, papildomas tekstas aplink JSON, arba HTML ar kito ne JSON kūno analizavimas kaip JSON.

Tiksli klaidos formuluotė skiriasi pagal JavaScript variklį ir naršyklę. Nemanikite, kad kiekviena vykdymo aplinka spausdina „Unexpected token X in JSON at position N“.

Tai Unexpected token šalinimas JSON.parse: ką klaida reiškia, kaip skaityti poziciją ir ką daryti, kai kūnas yra HTML. Plačiau apie gale esantį kablelį, kabutes ir Unexpected end rasite Dažnos JSON klaidos: gale esantis kablelis, kabutės ir Unexpected token.

Ką reiškia “Unexpected token” JSON.parse()?

JSON.parse() reikalauja JSON gramatikos. Nelegalus ženklas dabartinėje pozicijoje meta SyntaxError. {“name”:“Alex”,} neteisingas: po to kablelio objektas negali baigtis. Pranešimo tekstas ir pozicija vis dar skiriasi pagal runtime.

Kokią klaidą meta JSON.parse()?

Neteisingas JSON paprastai meta SyntaxError. Užrašykite error.name, kad patvirtintumėte tipą. Nekoduokite viso error.message: varikliai ir versijos jį formuluoja skirtingai.

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

1. Viengubos kabutės vietoj dvigubų

{‘name’:‘Alex’} yra neteisingas JSON. {“name”:“Alex”} teisingas. JSON eilutės ir objekto narių vardai naudoja dvigubas kabutes. JavaScript objekto literalis kaip const user = { name: ‘Alex’ } gali būti teisėtas JavaScript ir vis tiek nebūti JSON tekstas.

Neteisingas

{'name':'Alex'}

Teisingas

{"name":"Alex"}

2. Gale esantys kableliai

Kablelis po paskutinės savybės ar masyvo elemento nėra teisingas standartinis JSON. {“name”:“Alex”,“age”:30,} ir [1, 2, 3,] abu nepavyksta. Laikykite tai viena Unexpected token priežastimi; Dažnos JSON klaidos: gale esantis kablelis, kabutės ir Unexpected token gale esančius kablelius aptaria giliau.

Neteisingas

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

Teisingas

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

3. Savybių vardai be kabučių

{ name: “Alex” } gali būti JavaScript objekto literalis. JSON objekto narių vardai yra eilutės ir jiems reikia dvigubų kabučių: {“name”:“Alex”}.

Neteisingas

{
  name: "Alex"
}

Teisingas

{
  "name": "Alex"
}

4. Neteisingas eilutės escape

JSON tekste atvirkštinis pasvirasis brūkšnys pradeda escape. Neapdorotas kelias kaip C:\Users\Alex neteisingas, nes \U nėra teisėtas escape. Padvigubinkite atvirkštinius brūkšnius. Nemaišykite šeimininko kalbos escape su JSON escape. Dažnos JSON klaidos: gale esantis kablelis, kabutės ir Unexpected token tai aptaria giliau.

Neteisingas

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

Teisingas

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

5. Papildomas tekstas prieš JSON arba po jo

JSON.parse tikisi vienos JSON reikšmės. Priešdėlis kaip Success: prieš {“ok”:true}, arba priesaga kaip done po jos, padaro visą eilutę neteisingą. Nereikšmingi tarpai aplink vieną JSON reikšmę leidžiami. JSON nedraudžia tarpų prieš reikšmę ar po jos.

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

6. HTML analizavimas vietoj JSON

response.json() kvietimas HTML puslapyje yra dažnas Unexpected token atvejis. Neteisingi endpointai, 404 ar 500 HTML puslapiai, prisijungimo peradresavimai, tarpinio serverio kūnai ir atsarginiai puslapiai dažnai prasideda žymėmis. „Unexpected token < visada reiškia HTML“ per stipru: < yra užuomina, ne įrodymas.

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

Ką paprastai reiškia “Unexpected token <”?

JSON reikšmės paprastai neprasideda <. Jei kūnas prasideda arba , < gali būti pirmasis nelegalus ženklas. Vietiniame derinime tikrinkite HTTP būseną, Content-Type ir neapdorotą kūną. Variklio formuluotė vis dar skiriasi.

Patikrinkite atsakymą prieš analizuodami

fetch kūną galima sunaudoti tik kartą. Vietiniame derinime pirmiausia skaitykite text(), peržiūrėkite trumpą priešdėlį, tada JSON.parse tą pačią eilutę. Nekvieskite response.json(), o paskui response.text() tam pačiam atsakymui. Pagal numatymą neregistruokite jautrių gamybos krovinių.

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

Ką reiškia “at position 123”?

Kai kurie varikliai praneša poziciją, eilutę ar stulpelį. Ieškokite netoliese blogos kabutės, kablelio, skliausto ar escape. Tas indeksas yra, kur analizė pastebėjo problemą; tikroji priežastis gali būti anksčiau. Negarantuoja, kad tai tiksliai sugedęs ženklas.

Unexpected token palyginti su Unexpected end

Unexpected token reiškia, kad analizatorius sutiko ženklą, kurio nesitikėjo. Unexpected end gali pasirodyti, kai įvestis nutrūksta prieš reikšmei tapus visai, kaip {“name”:“Alex” be uždarančio riestinio skliausto. Tiksli formuluotė priklauso nuo variklio. Dažnos JSON klaidos: gale esantis kablelis, kabutės ir Unexpected token nebaigtą JSON aptaria plačiau.

{"name":"Alex"

JSON nėra tas pats kaip JavaScript objekto literalis

JSON yra duomenų formatas. JavaScript objekto literalis yra JavaScript sintaksė. JS objektas su raktais be kabučių, viengubomis kabutėmis ir gale esančiu kableliu nėra teisingas JSON tekstas. JSON.parse negali saugiai analizuoti JavaScript objekto literalų.

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

Ar JSON gali turėti komentarų?

Standartinis JSON nepalaiko komentarų. Eilutė // objekto viduje neteisinga. JSON5 ir panašūs plėtiniai yra kiti formatai. JSON formatavimas ir palyginimas tikrina standartinį JSON su JSON.parse ir nelaiko JSON5 JSON.

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

Ar undefined, NaN ir Infinity yra teisingas JSON?

Ne. JSON reikšmės yra objektas, masyvas, eilutė, skaičius, true, false ir null. undefined, NaN ir Infinity nėra. Viršutinio lygio reikšmė nebūtinai objektas ar masyvas: true, 123, “hello” ir null yra teisingas JSON.

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

Kaip žingsnis po žingsnio taisyti Unexpected token klaidą

Dirbkite su šaltiniu, ne su klaidos eilute:

  1. Patvirtinkite, kad įvestis tikrai JSON, o ne HTML, žurnalai ar JavaScript.
  2. Peržiūrėkite pirmuosius neapdorotos įvesties ženklus.
  3. Jei atėjo iš API, tikrinkite HTTP būseną ir Content-Type. Nei 200, nei application/json negarantuoja teisingo JSON.
  4. Patikrinkite sintaksę JSON analizatoriuje.
  5. Praneštą poziciją, eilutę ar stulpelį naudokite kaip užuominą, ne kaip garantuotą problemos šaknį.
  6. Tikrinkite kabutes, kablelius, riestinius skliaustus, laužtinius skliaustus ir escape prie tos zonos.
  7. Palyginkite su suformatuota, patikrinta kopija.
  8. Pataisykite serializatorių arba endpoint. Netrinkite pranešto žetono atsitiktinai.
„Netaisykite“ JSON atsitiktinai keisdami kabutes

Visuotinis ' keitimas į " gali sugadinti apostrofas eilutėse, jau escape'uotą tekstą ir šaltinius, kurie nėra JSON. Gaminkite teisingą JSON iš tikro serializatoriaus. Nelaikykite eval JSON analizatoriumi.

Naudokite JSON.stringify() gamindami JSON JavaScript

Verčiau JSON.stringify nei eilučių jungimas ranka. Išleidžia teisingą JSON tekstą reikšmėms, kurias serializuoja. Neišsaugo kiekvienos JavaScript reikšmės: undefined, funkcijos ir simboliai turi ypatingą elgesį. Tas detalumas čia nepatenka į sritį.

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

Neteisingas JSON palyginti su tikru pataisymu

Šios poros patikrintos su JSON.parse. HTML atveju pataisymas yra atsakymas, ne sintaksės redagavimas.

Problema Neteisingas Pataisymas
Viengubos kabutės {'a':1} {"a":1}
Gale esantis kablelis {"a":1,} {"a":1}
Raktas be kabučių {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
HTML kūnas <html>... Patikrinkite endpoint ir neapdorotą atsakymą. Neredaguokite HTML į JSON.

Paprastas Unexpected token sprendimų vadovas

Jei JSON.parse nepavyko, pirmiausia nuspręskite, ar išvis turite JSON, prieš perrašydami kabutes.

  • JSON.parse nepavyko
  • Iš API? Tikrinkite būseną, Content-Type ir neapdorotą kūną
  • Ar prasideda kaip JSON? Jei ne, taisykite šaltinį arba endpoint
  • Jei taip, tikrinkite kabutes, kablelius, riestinius skliaustus, laužtinius skliaustus, escape, nepalaikomas reikšmes
  • Praneštą poziciją naudokite kaip užuominą
  • Pataisykite šaltinį, tada analizuokite vėl
Unexpected token įvardija staigmeną. Teksto šaltinis dažnai yra tikrasis pataisymas.

Patikrinkite JSON prieš analizuodami ar naudodami

NEXNARA JSON formatavimas ir palyginimas tikrina JSON naršyklėje su JSON.parse—ne eval.

Tikrinimas, gražus formatavimas su 2 tarpais, 4 tarpais ar tabuliacijomis, minify, kopijavimas, atsisiuntimas ir .json įkėlimas. JSON Diff apima įdėtus objektus ir masyvus, kelius, santrauką, filtrus ir sukeitimą. Po analizės tos pačios duomenų gražiai suformatuota ir minify kopijos lyginamos kaip lygios; objekto raktai lyginami pagal vardą.

Tekstas, didesnis nei 5 MB, gali atrodyti lėtas. Tekstas, didesnis nei 15 MB, naršyklėje neapdorojamas.

JSON tikrinimas ir formatavimas vyksta jūsų naršyklėje. Šis įrankis nesiunčia JSON į NEXNARA serverį. Skelbimai ir kitos svetainės funkcijos vis tiek naudoja tinklą.

Įklijuokite nepavykstančią eilutę į JSON formatavimas ir palyginimas ir perskaitykite pirmuosius ženklus prieš perrašydami kabutes.

FAQ

Kodėl JSON.parse sako Unexpected token?

Tekstas nėra teisingas JSON toje vietoje, kur analizatorius sustojo. Tipinės priežastys: kabutės, kableliai, papildomas tekstas arba kūnas, kuris nėra JSON, pavyzdžiui HTML.

Ką reiškia Unexpected token < in JSON?

Pirmasis nelegalus ženklas gali būti <. Tai dažnai rodo HTML puslapį, bet nėra 404 ar HTML įrodymas kiekvienu atveju. Tikrinkite būseną, Content-Type ir neapdorotą kūną.

Kaip rasti klaidos poziciją JSON?

Jei variklis praneša poziciją, eilutę ar stulpelį, žiūrėkite netoliese. Tikroji klaida gali būti anksčiau. Naudokite kaip užuominą, tada tikrinkite.

Ar JSON gali naudoti viengubas kabutes?

Ne. Standartiniame JSON eilutės ir narių vardai naudoja dvigubas kabutes.

Ar JSON gali turėti gale esančių kablelių?

Ne. Standartinis JSON neleidžia kablelio po paskutinės savybės ar masyvo elemento.

Kaip patikrinti, ar eilutė yra teisingas JSON?

Kvieskite JSON.parse try/catch, arba įklijuokite tekstą į JSON formatavimas ir palyginimas. Jei analizė meta SyntaxError, eilutė nėra teisingas JSON.