Tech Help

Miért mondja a JSON.parse, hogy "Unexpected token"?

A JSON.parse Unexpected tokent dob, ha a szöveg nem érvényes JSON. Derítse ki a szimpla idézőjelet, a záró vesszőt, a HTML-választ és a hiba pozícióját.

Gyors válasz

A JSON.parse() SyntaxErrort dob, ha a bemenet nem érvényes JSON. Az „Unexpected token” általában azt jelenti, hogy az elemző olyan karaktert ért el, amely azon a ponton a szerkezetben nem engedélyezett.

Gyakori okok a szimpla idézőjel, a záró vessző, az idézőjel nélküli tulajdonságnév, a rossz sztring-escape, extra szöveg a JSON körül, vagy HTML illetve más, nem JSON törzs JSON-ként való elemzése.

A hiba pontos szövege a JavaScript motortól és a böngészőtől függ. Ne feltételezze, hogy minden futtatókörnyezet ezt írja: „Unexpected token X in JSON at position N”.

Ez a JSON.parse Unexpected token hibaelhárítása: mit jelent a hiba, hogyan olvassa a pozíciót, és mit tegyen, ha a törzs HTML. A záró vessző, az idézőjelek és az Unexpected end tágabb lefedése a Gyakori JSON-hibák: záró vessző, idézőjelek és Unexpected token oldalon van.

Mit jelent az “Unexpected token” a JSON.parse()-ban?

A JSON.parse() JSON-nyelvtant vár. Az aktuális pozíción lévő törvénytelen karakter SyntaxErrort dob. A {“name”:“Alex”,} érvénytelen: a vessző után az objektum nem zárulhat. Az üzenet szövege és a pozíció továbbra is a futtatókörnyezettől függ.

Milyen hibát dob a JSON.parse()?

Az érvénytelen JSON általában SyntaxErrort dob. Naplózza az error.name értéket a típus megerősítéséhez. Ne kódolja be a teljes error.message szöveget: a motorok és verziók másként fogalmaznak.

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

1. Szimpla idézőjel dupla helyett

A {‘name’:‘Alex’} érvénytelen JSON. A {“name”:“Alex”} érvényes. A JSON-sztringek és az objektumtagok nevei dupla idézőjelet használnak. Egy JavaScript objektumliterál, például const user = { name: ‘Alex’ }, lehet törvényes JavaScript, és mégsem JSON-szöveg.

Érvénytelen

{'name':'Alex'}

Érvényes

{"name":"Alex"}

2. Záró vesszők

Az utolsó tulajdonság vagy tömbelem utáni vessző nem érvényes szabványos JSON. A {“name”:“Alex”,“age”:30,} és a [1, 2, 3,] egyaránt elbukik. Tekintse ezt egy Unexpected token oknak; a Gyakori JSON-hibák: záró vessző, idézőjelek és Unexpected token a záró vesszőt mélyebben tárgyalja.

Érvénytelen

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

Érvényes

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

3. Idézőjel nélküli tulajdonságnevek

A { name: “Alex” } lehet JavaScript objektumliterál. JSON-ban a tagnevek sztringek, és dupla idézőjel kell: {“name”:“Alex”}.

Érvénytelen

{
  name: "Alex"
}

Érvényes

{
  "name": "Alex"
}

4. Érvénytelen sztring-escape

JSON-szövegben a fordított perjel escape-et indít. Egy nyers útvonal, mint C:\Users\Alex, érvénytelen, mert a \U nem törvényes escape. Duplázza a fordított perjeleket. Ne keverje a gazdanyelv sztring-escape-jét a JSON-escape-pel. A Gyakori JSON-hibák: záró vessző, idézőjelek és Unexpected token ezt mélyebben tárgyalja.

Érvénytelen

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

Érvényes

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

5. Extra szöveg a JSON előtt vagy után

A JSON.parse egy JSON-értéket vár. Egy Success: előtag a {“ok”:true} előtt, vagy egy done utótag utána, az egész sztringet érvénytelenné teszi. A jelentéktelen whitespace egyetlen JSON-érték körül megengedett. A JSON nem tiltja a szóközöket az érték előtt vagy után.

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

6. HTML elemzése JSON helyett

A response.json() hívása HTML-oldalon gyakori Unexpected token eset. Rossz endpointok, 404 vagy 500 HTML-oldalak, bejelentkezési átirányítások, proxy törzsek és tartalék oldalak gyakran jelöléssel kezdődnek. Az „Unexpected token < mindig HTML-t jelent” túl erős: a < nyom, nem bizonyíték.

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

Mit jelent általában az “Unexpected token <”?

A JSON-értékek általában nem < jellel kezdődnek. Ha a törzs vagy jellel indul, a < lehet az első törvénytelen karakter. Helyi hibakereséskor ellenőrizze a HTTP-állapotot, a Content-Type értéket és a nyers törzset. A motor megfogalmazása továbbra is változik.

Ellenőrizze a választ, mielőtt elemzi

A fetch törzse csak egyszer fogyasztható. Helyi hibakereséskor olvassa először a text() értéket, nézzen meg egy rövid előtagot, majd futtassa a JSON.parse-t ugyanazon a sztringen. Ne hívja a response.json() és utána a response.text() metódust ugyanazon a válaszon. Ne naplózzon alapból érzékeny éles terhelést.

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

Mit jelent az “at position 123”?

Egyes motorok pozíciót, sort vagy oszlopot jeleznek. Keressen a közelben rossz idézőjelet, vesszőt, kapcsos zárójelet vagy escape-et. Az index az, ahol az elemzés problémát észlelt; a valódi ok korábban lehet. Nem garantált, hogy pontosan a hibás karakter.

Unexpected token versus Unexpected end

Az Unexpected token azt jelenti, hogy az elemző olyan karaktert talált, amelyet nem várt. Az Unexpected end akkor jelenhet meg, ha a bemenet megáll, mielőtt az érték kész, például {“name”:“Alex” záró kapcsos zárójel nélkül. A pontos megfogalmazás a motortól függ. A Gyakori JSON-hibák: záró vessző, idézőjelek és Unexpected token a hiányos JSON-t tágabban tárgyalja.

{"name":"Alex"

A JSON nem ugyanaz, mint egy JavaScript objektumliterál

A JSON adatformátum. A JavaScript objektumliterál JavaScript szintaxis. A JS objektum idézőjel nélküli kulcsokkal, szimpla idézőjellel és záró vesszővel nem érvényes JSON-szöveg. A JSON.parse nem tudja biztonságosan elemezni a JavaScript objektumliterálokat.

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

Tartalmazhat a JSON megjegyzést?

A szabványos JSON nem támogat megjegyzést. Egy // sor egy objektumban érvénytelen. A JSON5 és hasonló kiterjesztések más formátumok. A JSON formázás és összehasonlítás a szabványos JSON-t JSON.parse-szal ellenőrzi, és a JSON5-öt nem kezeli JSON-ként.

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

Érvényes JSON az undefined, a NaN és az Infinity?

Nem. A JSON-értékek objektum, tömb, sztring, szám, true, false és null. Az undefined, a NaN és az Infinity nem. A felső szintű értéknek nem kell objektumnak vagy tömbnek lennie: a true, a 123, a “hello” és a null érvényes JSON.

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

Hogyan javítsa az Unexpected token hibát lépésről lépésre

A forrással dolgozzon, ne a hiba sztringjével:

  1. Erősítse meg, hogy a bemenet valóban JSON, nem HTML, napló vagy JavaScript.
  2. Vizsgálja meg a nyers bemenet első karaktereit.
  3. Ha API-ból jött, ellenőrizze a HTTP-állapotot és a Content-Type értéket. Sem a 200, sem az application/json nem garantál érvényes JSON-t.
  4. Ellenőrizze a szintaxist JSON-elemzőben.
  5. Használja a jelzett pozíciót, sort vagy oszlopot nyomként, ne garantált gyökérokokként.
  6. Ellenőrizze az idézőjeleket, vesszőket, kapcsos és szögletes zárójeleket és escape-eket a környéken.
  7. Hasonlítsa össze egy formázott, ellenőrzött másolattal.
  8. Javítsa a szerializálót vagy az endpointot. Ne törölje véletlenszerűen a jelzett tokent.
Ne „javítsa” a JSON-t idézőjelek véletlen cseréjével

A ' globális cseréje "-re tönkreteheti a sztringeken belüli aposztrófokat, a már escape-elt szöveget és a nem JSON forrásokat. Állítson elő érvényes JSON-t a valódi szerializálóból. Ne kezelje eval JSON-elemzőként.

Használja a JSON.stringify() metódust, ha JSON-t állít elő JavaScriptben

A JSON.stringify jobb, mint a sztringek kézi összefűzése. Érvényes JSON-szöveget bocsát ki a szerializált értékekhez. Nem őriz meg minden JavaScript értéket: az undefined, a függvények és a szimbólumok külön viselkednek. Ez a részlet itt kívül esik.

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

Érvénytelen JSON versus valódi javítás

Ezeket a párokat JSON.parse-szal ellenőriztük. HTML esetén a javítás a válasz, nem szintaxis-szerkesztés.

Probléma Érvénytelen Javítás
Szimpla idézőjel {'a':1} {"a":1}
Záró vessző {"a":1,} {"a":1}
Idézőjel nélküli kulcs {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
HTML törzs <html>... Ellenőrizze az endpointot és a nyers választ. Ne szerkessze a HTML-t JSON-ná.

Egyszerű Unexpected token döntési útmutató

Ha a JSON.parse elbukott, döntse el, hogy egyáltalán JSON-ja van-e, mielőtt átírná az idézőjeleket.

  • A JSON.parse elbukott
  • API-ból? Ellenőrizze az állapotot, a Content-Type értéket és a nyers törzset
  • JSON-nal kezdődik? Ha nem, javítsa a forrást vagy az endpointot
  • Ha igen, ellenőrizze az idézőjeleket, vesszőket, kapcsos és szögletes zárójeleket, escape-eket, nem támogatott értékeket
  • Használja a jelzett pozíciót nyomként
  • Javítsa a forrást, majd elemezze újra
Az Unexpected token a meglepetést nevezi meg. A szöveg forrása gyakran a valódi javítás.

Ellenőrizze a JSON-t elemzés vagy használat előtt

A NEXNARA JSON formázás és összehasonlítás a böngészőben JSON.parse-szal ellenőrzi a JSON-t—nem eval.

Validálás, szépítés 2 szóközzel, 4 szóközzel vagy tabulátorral, minify, másolás, letöltés és .json feltöltés. A JSON Diff fedi a beágyazott objektumokat és tömböket, útvonalakat, összefoglalót, szűrőket és cserét. Elemzés után ugyanazon adat szépített és minifikált másolata egyenlőnek számít; az objektumkulcsok név szerint hasonlítódnak.

Az 5 MB-nál nagyobb szöveg lassúnak tűnhet. A 15 MB-nál nagyobb szöveget a böngésző nem dolgozza fel.

A JSON ellenőrzése és formázása a böngészőjében történik. Ez az eszköz nem küldi a JSON-t NEXNARA-kiszolgálóra. A hirdetések és más oldalfunkciók továbbra is használják a hálózatot.

Illessze be a hibás sztringet a JSON formázás és összehasonlítás eszközbe, és olvassa el az első karaktereket, mielőtt átírná az idézőjeleket.

FAQ

Miért mondja a JSON.parse, hogy Unexpected token?

A szöveg nem érvényes JSON azon a ponton, ahol az elemző megállt. Tipikus okok: idézőjelek, vesszők, extra szöveg vagy nem JSON törzs, például HTML.

Mit jelent az Unexpected token < in JSON?

Az első törvénytelen karakter lehet a <. Ez gyakran HTML-oldalra utal, de nem bizonyíték 404-re, sem HTML-re minden esetben. Ellenőrizze az állapotot, a Content-Type értéket és a nyers törzset.

Hogyan találom meg a hiba pozícióját JSON-ban?

Ha a motor pozíciót, sort vagy oszlopot jelez, nézzen a közelbe. A valódi hiba korábban lehet. Használja nyomként, majd ellenőrizzen.

Használhat a JSON szimpla idézőjelet?

Nem. A szabványos JSON-ban a sztringek és a tagnevek dupla idézőjelet használnak.

Lehet a JSON-ban záró vessző?

Nem. A szabványos JSON nem enged vesszőt az utolsó tulajdonság vagy tömbelem után.

Hogyan ellenőrizzem, hogy egy sztring érvényes JSON-e?

Hívja a JSON.parse-t try/catch blokkban, vagy illessze be a szöveget a JSON formázás és összehasonlítás eszközbe. Ha az elemzés SyntaxErrort dob, a sztring nem érvényes JSON.