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.
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:
- Erősítse meg, hogy a bemenet valóban JSON, nem HTML, napló vagy JavaScript.
- Vizsgálja meg a nyers bemenet első karaktereit.
- 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.
- Ellenőrizze a szintaxist JSON-elemzőben.
- Használja a jelzett pozíciót, sort vagy oszlopot nyomként, ne garantált gyökérokokként.
- Ellenőrizze az idézőjeleket, vesszőket, kapcsos és szögletes zárójeleket és escape-eket a környéken.
- Hasonlítsa össze egy formázott, ellenőrzött másolattal.
- Javítsa a szerializálót vagy az endpointot. Ne törölje véletlenszerűen a jelzett tokent.
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
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.