Tech Help
Hvorfor sier JSON.parse "Unexpected token"?
JSON.parse kaster Unexpected token når teksten ikke er gyldig JSON. Feilsøk enkle anførselstegn, avsluttende komma, HTML-svar og feilposisjonen.
JSON.parse() kaster et SyntaxError når inndata ikke er gyldig JSON. «Unexpected token» betyr vanligvis at parseren nådde et tegn som ikke er tillatt på det punktet i strukturen.
Typiske årsaker er enkle anførselstegn, avsluttende komma, egenskapsnavn uten anførselstegn, dårlig streng-escape, ekstra tekst rundt JSON, eller at HTML eller en annen ikke-JSON-kropp parses som JSON.
Den nøyaktige feilteksten varierer med JavaScript-motor og nettleser. Ikke gå ut fra at hver runtime skriver «Unexpected token X in JSON at position N».
Dette er feilsøking av Unexpected token i JSON.parse: hva feilen betyr, hvordan du leser posisjonen, og hva du gjør når kroppen er HTML. Bredere dekning av avsluttende komma, anførselstegn og Unexpected end finner du i Vanlige JSON-feil: avsluttende komma, anførselstegn og Unexpected token.
Hva betyr “Unexpected token” i JSON.parse()?
JSON.parse() krever JSON-grammatikk. Et ulovlig tegn på gjeldende posisjon kaster SyntaxError. {“name”:“Alex”,} er ugyldig: etter det kommaet kan ikke objektet avsluttes. Meldingstekst og posisjon varierer fortsatt per runtime.
Hvilken feil kaster JSON.parse()?
Ugyldig JSON kaster vanligvis SyntaxError. Logg error.name for å bekrefte typen. Ikke hardkod hele error.message: motorer og versjoner formulerer det forskjellig.
try {
JSON.parse('{"name":"Alex",}');
} catch (error) {
console.log(error.name);
// SyntaxError
}
1. Enkle anførselstegn i stedet for doble
{‘name’:‘Alex’} er ugyldig JSON. {“name”:“Alex”} er gyldig. JSON-strenger og objektmedlemsnavn bruker doble anførselstegn. En JavaScript-objektliteral som const user = { name: ‘Alex’ } kan være lovlig JavaScript og likevel ikke være JSON-tekst.
Ugyldig
{'name':'Alex'}
Gyldig
{"name":"Alex"}
2. Avsluttende komma
Et komma etter den siste egenskapen eller det siste array-elementet er ikke gyldig standard-JSON. {“name”:“Alex”,“age”:30,} og [1, 2, 3,] feiler begge. Behandle det som én årsak til Unexpected token; Vanlige JSON-feil: avsluttende komma, anførselstegn og Unexpected token dekker avsluttende komma mer i dybden.
Ugyldig
{
"name": "Alex",
"age": 30,
}
Gyldig
{
"name": "Alex",
"age": 30
}
[1, 2, 3,]
3. Egenskapsnavn uten anførselstegn
{ name: “Alex” } kan være en JavaScript-objektliteral. I JSON er objektmedlemsnavn strenger og trenger doble anførselstegn: {“name”:“Alex”}.
Ugyldig
{
name: "Alex"
}
Gyldig
{
"name": "Alex"
}
4. Ulovlig escape i strenger
I JSON-tekst starter en omvendt skråstrek en escape. En rå bane som C:\Users\Alex er ugyldig fordi \U ikke er en lovlig escape. Doble de omvendte skråstrekene. Ikke bland vertsspråkets streng-escape med JSON-escape. Vanlige JSON-feil: avsluttende komma, anførselstegn og Unexpected token dekker dette mer i dybden.
Ugyldig
{"file":"C:\Users\Alex"}
Gyldig
{"file":"C:\\Users\\Alex"}
5. Ekstra tekst før eller etter JSON
JSON.parse forventer én JSON-verdi. Et prefiks som Success: foran {“ok”:true}, eller et suffiks som done etter, gjør hele strengen ugyldig. Uvesentlig whitespace rundt en enkelt JSON-verdi er tillatt. JSON forbyr ikke mellomrom før eller etter verdien.
Success:
{"ok":true}
{"ok":true}
done
6. Tolke HTML som om det var JSON
Å kalle response.json() på en HTML-side er et vanlig Unexpected token-tilfelle. Feil endepunkt, HTML-sider ved 404 eller 500, innloggingsomdirigeringer, proxy-kropper og reservesider begynner ofte med merking. «Unexpected token < betyr alltid HTML» er for sterkt: < er et hint, ikke et bevis.
fetch('/api/data')
.then(response => response.json())
Hva betyr “Unexpected token <” vanligvis?
JSON-verdier starter vanligvis ikke med <. Hvis kroppen begynner med eller , kan < være det første ulovlige tegnet. Under lokal feilsøking sjekker du HTTP-status, Content-Type og råkroppen. Motorens formulering varierer fortsatt.
Sjekk svaret før du parser det
Kroppen fra fetch kan bare konsumeres én gang. Under lokal feilsøking leser du text() først, inspiserer et kort prefiks og kjører deretter JSON.parse på den samme strengen. Ikke kall response.json() og deretter response.text() på det samme svaret. Ikke logg sensitive produksjonsnyttelaster som standard.
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 betyr “at position 123”?
Noen motorer rapporterer en posisjon, linje eller kolonne. Se i nærheten etter et dårlig anførselstegn, komma, klamme eller escape. Den indeksen er der parsingen merket et problem; den virkelige årsaken kan ligge tidligere. Det er ikke garantert å være det nøyaktig feilaktige tegnet.
Unexpected token mot Unexpected end
Unexpected token betyr at parseren møtte et tegn den ikke forventet. Unexpected end kan dukke opp når inndata stopper før verdien er ferdig, som i {“name”:“Alex” uten lukkende klamme. Nøyaktig formulering avhenger av motoren. Vanlige JSON-feil: avsluttende komma, anførselstegn og Unexpected token dekker ufullstendig JSON mer bredt.
{"name":"Alex"
JSON er noe annet enn en JavaScript-objektliteral
JSON er et dataformat. En JavaScript-objektliteral er JavaScript-syntaks. JS-objektet med nøkler uten anførselstegn, enkle anførselstegn og et avsluttende komma er ikke gyldig JSON-tekst. JSON.parse kan ikke trygt parse JavaScript-objektliteraler.
const data = {
name: 'Alex',
active: true,
};
{
"name": "Alex",
"active": true
}
Kan JSON inneholde kommentarer?
Standard-JSON støtter ikke kommentarer. En // linje inne i et objekt er ugyldig. JSON5 og lignende utvidelser er andre formater. Formater og sammenlign JSON validerer standard-JSON med JSON.parse og behandler ikke JSON5 som JSON.
{
// user name
"name": "Alex"
}
Kan undefined, NaN og Infinity inngå i gyldig JSON?
Nei. JSON-verdier er objekt, array, streng, tall, true, false og null. undefined, NaN og Infinity er det ikke. En toppnivåverdi trenger ikke å være objekt eller array: true, 123, “hello” og null er gyldig JSON.
{"a":undefined}
{"a":NaN}
{"a":Infinity}
true
123
"hello"
null
Slik retter du en Unexpected token-feil steg for steg
Jobb med kilden, ikke feilstrengen:
- Bekreft at inndata faktisk er JSON, ikke HTML, logger eller JavaScript.
- Inspiser de første tegnene i rå inndata.
- Hvis det kom fra et API, sjekk HTTP-status og Content-Type. Verken 200 eller application/json garanterer gyldig JSON.
- Sjekk syntaksen i en JSON-parser.
- Bruk en rapportert posisjon, linje eller kolonne som hint, ikke som den garanterte rotårsaken.
- Sjekk anførselstegn, komma, klammer, hakeparenteser og escapes nær det området.
- Sammenlign med en formatert, validert kopi.
- Rett serialisereren eller endepunktet. Ikke slett det rapporterte tokenet på måfå.
En global erstatning av ' med " kan ødelegge apostrofer inne i strenger, allerede escapet tekst og kilder som ikke er JSON. Produser gyldig JSON fra den ekte serialisereren. Ikke behandle eval som en JSON-parser.
Bruk JSON.stringify() når du lager JSON i JavaScript
Foretrekk JSON.stringify framfor å sette sammen strenger for hånd. Den sender ut gyldig JSON-tekst for verdiene den serialiserer. Den bevarer ikke hver JavaScript-verdi: undefined, funksjoner og symboler har særskilt oppførsel. Den detaljen ligger utenfor denne teksten.
const data = {
name: "Alex",
active: true
};
const json = JSON.stringify(data);
// {"name":"Alex","active":true}
Ugyldig JSON versus en ekte retting
Disse parene ble sjekket med JSON.parse. For HTML er rettingen svaret, ikke en syntaksredigering.
| Problem | Ugyldig | Retting |
|---|---|---|
| Enkle anførselstegn | {'a':1} |
{"a":1} |
| Avsluttende komma | {"a":1,} |
{"a":1} |
| Nøkkel uten anførselstegn | {a:1} |
{"a":1} |
| undefined | {"a":undefined} |
{"a":null} |
| HTML-innhold | <html>... |
Sjekk endepunktet og råsvaret. Ikke rediger HTML til JSON. |
En enkel beslutningsguide for Unexpected token
Hvis JSON.parse feilet, avgjør om du i det hele tatt har JSON før du skriver om anførselstegn.
- JSON.parse feilet
- Fra et API? Sjekk status, Content-Type og råkroppen
- Begynner det som JSON? Hvis ikke, rett kilden eller endepunktet
- Hvis ja, valider anførselstegn, komma, klammer, hakeparenteser, escapes, verdier som ikke støttes
- Bruk den rapporterte posisjonen som hint
- Rett kilden, og parse på nytt
Valider JSON før du parser eller bruker den
NEXNARA Formater og sammenlign JSON validerer JSON i nettleseren med JSON.parse—ikke eval.
Valider, pynt med 2 mellomrom, 4 mellomrom eller tabulator, minify, kopier, last ned og last opp .json. JSON Diff dekker nøstede objekter og arrayer, baner, sammendrag, filtre og bytte. Etter parse sammenlignes pyntet og minifisert kopi av de samme dataene som like; objektnøkler sammenlignes på navn.
Tekst større enn 5 MB kan føles treg. Tekst større enn 15 MB behandles ikke i nettleseren.
JSON-validering og formatering skjer i nettleseren din. Dette verktøyet sender ikke JSON til en NEXNARA-server. Annonser og andre nettstedfunksjoner bruker fortsatt nettverket.
Lim inn den feilende strengen i Formater og sammenlign JSON og les de første tegnene før du skriver om anførselstegn.
FAQ
Hvorfor sier JSON.parse Unexpected token?
Teksten er ikke gyldig JSON på det punktet der parseren stoppet. Typiske årsaker er anførselstegn, komma, ekstra tekst eller en ikke-JSON-kropp som HTML.
Hva betyr Unexpected token < in JSON?
Det første ulovlige tegnet kan være <. Det peker ofte mot en HTML-side, men det er ikke bevis for en 404 eller for HTML i alle tilfeller. Sjekk status, Content-Type og råkroppen.
Hvordan finner jeg feilposisjonen i JSON?
Hvis motoren rapporterer en posisjon, linje eller kolonne, se i nærheten. Den virkelige feilen kan sitte tidligere. Bruk den som hint, og valider deretter.
Kan JSON bruke enkle anførselstegn?
Nei. I standard-JSON bruker strenger og medlemsnavn doble anførselstegn.
Kan JSON ha avsluttende komma?
Nei. Standard-JSON tillater ikke et komma etter den siste egenskapen eller det siste array-elementet.
Hvordan sjekker jeg om en streng er gyldig JSON?
Kall JSON.parse i en try/catch, eller lim inn teksten i Formater og sammenlign JSON. Hvis parsingen kaster SyntaxError, er strengen ikke gyldig JSON.