Tech Help

Hvorfor siger JSON.parse "Unexpected token"?

JSON.parse kaster Unexpected token, når teksten ikke er gyldig JSON. Fejlfind enkelte anførselstegn, afsluttende komma, HTML-svar og fejlpositionen.

Hurtigt svar

JSON.parse() kaster et SyntaxError, når inputtet ikke er gyldig JSON. ”Unexpected token” betyder typisk, at parseren nåede et tegn, der ikke er tilladt på det sted i strukturen.

Hyppige årsager er enkelte anførselstegn, afsluttende komma, egenskabsnavne uden anførselstegn, dårlig streng-escape, ekstra tekst omkring JSON, eller at HTML eller en anden ikke-JSON-krop parses som JSON.

Den præcise fejltekst skifter med JavaScript-motor og browser. Antag ikke, at hver runtime printer ”Unexpected token X in JSON at position N”.

Dette er fejlfinding af Unexpected token i JSON.parse: hvad fejlen betyder, hvordan du læser positionen, og hvad du gør, når kroppen er HTML. Bredere dækning af afsluttende komma, anførselstegn og Unexpected end ligger i Almindelige JSON-fejl: afsluttende komma, anførselstegn og Unexpected token.

Hvad betyder “Unexpected token” i JSON.parse()?

JSON.parse() kræver JSON-grammatik. Et ulovligt tegn på den aktuelle position kaster SyntaxError. {“name”:“Alex”,} er ugyldig: efter det komma må objektet ikke slutte. Beskedtekst og position varierer stadig efter runtime.

Hvilken fejl kaster JSON.parse()?

Ugyldig JSON kaster som regel SyntaxError. Log error.name for at bekræfte typen. Hardcod ikke hele error.message: motorer og versioner formulerer det forskelligt.

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

1. Enkelte anførselstegn i stedet for dobbelte

{‘name’:‘Alex’} er ugyldig JSON. {“name”:“Alex”} er gyldig. JSON-strenge og objektmedlemsnavne bruger dobbelte anførselstegn. En JavaScript-objektliteral som const user = { name: ‘Alex’ } kan være lovlig JavaScript og alligevel ikke være JSON-tekst.

Ugyldig

{'name':'Alex'}

Gyldig

{"name":"Alex"}

2. Afsluttende kommaer

Et komma efter den sidste egenskab eller det sidste array-element er ikke gyldig standard-JSON. {“name”:“Alex”,“age”:30,} og [1, 2, 3,] fejler begge. Behandl det som én årsag til Unexpected token; Almindelige JSON-fejl: afsluttende komma, anførselstegn og Unexpected token dækker afsluttende komma mere indgående.

Ugyldig

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

Gyldig

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

3. Egenskabsnavne uden anførselstegn

{ name: “Alex” } kan være en JavaScript-objektliteral. I JSON er objektmedlemsnavne strenge og skal have dobbelte anførselstegn: {“name”:“Alex”}.

Ugyldig

{
  name: "Alex"
}

Gyldig

{
  "name": "Alex"
}

4. Ugyldig streng-escape

I JSON-tekst starter et omvendt skråstreg en escape. En rå sti som C:\Users\Alex er ugyldig, fordi \U ikke er en lovlig escape. Fordobl de omvendte skråstreger. Bland ikke escape i værts sproget med JSON-escape. Almindelige JSON-fejl: afsluttende komma, anførselstegn og Unexpected token dækker det mere indgående.

Ugyldig

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

Gyldig

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

5. Ekstra tekst før eller efter JSON

JSON.parse forventer én JSON-værdi. Et præfiks som Success: foran {“ok”:true}, eller et suffiks som done bagefter, gør hele strengen ugyldig. Ubetydeligt whitespace omkring en enkelt JSON-værdi er tilladt. JSON forbyder ikke mellemrum før eller efter værdien.

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

6. Parse HTML i stedet for JSON

At kalde response.json() på en HTML-side er et almindeligt Unexpected token-tilfælde. Forkerte endpoints, HTML-sider ved 404 eller 500, login-omdirigeringer, proxy-kroppe og fallback-sider begynder ofte med markup. ”Unexpected token < betyder altid HTML” er for stærkt: < er et hint, ikke et bevis.

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

Hvad betyder “Unexpected token <” som regel?

JSON-værdier starter normalt ikke med <. Hvis kroppen begynder med eller , kan < være det første ulovlige tegn. Under lokal fejlfinding skal du tjekke HTTP-status, Content-Type og den rå krop. Motorens formulering varierer stadig.

Tjek svaret, før du parser det

Kroppen fra fetch kan kun forbruges én gang. Under lokal fejlfinding skal du læse text() først, inspicere et kort præfiks og derefter køre JSON.parse på den samme streng. Kald ikke response.json() og bagefter response.text() på det samme svar. Log ikke følsomme produktionspayloads 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);
}

Hvad betyder “at position 123”?

Nogle motorer rapporterer en position, linje eller kolonne. Kig i nærheden efter et dårligt anførselstegn, komma, klamme eller escape. Det indeks er dér, parsningen opdagede et problem; den reelle årsag kan ligge tidligere. Det er ikke garanteret at være det præcist defekte tegn.

Unexpected token versus Unexpected end

Unexpected token betyder, at parseren mødte et tegn, den ikke forventede. Unexpected end kan dukke op, når inputtet stopper, før værdien er færdig, som i {“name”:“Alex” uden lukkende klamme. Den præcise formulering afhænger af motoren. Almindelige JSON-fejl: afsluttende komma, anførselstegn og Unexpected token dækker ufuldstændig JSON mere bredt.

{"name":"Alex"

JSON er ikke det samme som en JavaScript-objektliteral

JSON er et dataformat. En JavaScript-objektliteral er JavaScript-syntaks. JS-objektet med nøgler uden anførselstegn, enkelte anførselstegn og et afsluttende komma er ikke gyldig JSON-tekst. JSON.parse kan ikke sikkert parse JavaScript-objektliteraler.

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

Kan JSON indeholde kommentarer?

Standard-JSON understøtter ikke kommentarer. En // linje inde i et objekt er ugyldig. JSON5 og lignende udvidelser er andre formater. Formatér og sammenlign JSON validerer standard-JSON med JSON.parse og behandler ikke JSON5 som JSON.

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

Er undefined, NaN og Infinity gyldig JSON?

Nej. JSON-værdier er objekt, array, streng, tal, true, false og null. undefined, NaN og Infinity er det ikke. En topniveau-værdi behøver ikke at være objekt eller array: true, 123, “hello” og null er gyldig JSON.

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

Sådan retter du en Unexpected token-fejl trin for trin

Arbejd med kilden, ikke fejlstrengen:

  1. Bekræft, at inputtet faktisk er JSON, ikke HTML, logs eller JavaScript.
  2. Inspicer de første tegn i det rå input.
  3. Hvis det kom fra et API, tjek HTTP-status og Content-Type. Hverken 200 eller application/json garanterer gyldig JSON.
  4. Valider syntaksen i en JSON-parser.
  5. Brug en rapporteret position, linje eller kolonne som hint, ikke som den garanterede rodårsag.
  6. Tjek anførselstegn, kommaer, klammer, parenteser og escapes nær det område.
  7. Sammenlign med en formateret, valideret kopi.
  8. Ret serialisereren eller endpointet. Slet ikke det rapporterede token på må og få.
"Ret" ikke JSON ved tilfældigt at udskifte anførselstegn

En global erstatning af ' med " kan ødelægge apostroffer inde i strenge, allerede escapet tekst og kilder, der ikke er JSON. Producer gyldig JSON fra den rigtige serialiserer. Behandl ikke eval som en JSON-parser.

Brug JSON.stringify(), når du producerer JSON i JavaScript

Foretræk JSON.stringify frem for at sammenkæde strenge i hånden. Den udsender gyldig JSON-tekst for de værdier, den serialiserer. Den bevarer ikke hver JavaScript-værdi: undefined, funktioner og symboler har særlig adfærd. Den detalje ligger uden for denne tekst.

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

Ugyldig JSON versus en rigtig rettelse

Disse par blev tjekket med JSON.parse. For HTML er rettelsen svaret, ikke en syntaksredigering.

Problem Ugyldig Rettelse
Enkelte anførselstegn {'a':1} {"a":1}
Afsluttende komma {"a":1,} {"a":1}
Nøgle uden anførselstegn {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
HTML-krop <html>... Tjek endpointet og det rå svar. Rediger ikke HTML til JSON.

En enkel beslutningsguide til Unexpected token

Hvis JSON.parse fejlede, så afgør, om du overhovedet har JSON, før du omskriver anførselstegn.

  • JSON.parse fejlede
  • Fra et API? Tjek status, Content-Type og den rå krop
  • Begynder det som JSON? Hvis ikke, ret kilden eller endpointet
  • Hvis ja, valider anførselstegn, kommaer, klammer, parenteser, escapes, ikke-understøttede værdier
  • Brug den rapporterede position som hint
  • Ret kilden, og parse igen
Unexpected token navngiver overraskelsen. Kilden til teksten er ofte den rigtige rettelse.

Valider JSON, før du parser eller bruger den

NEXNARA Formatér og sammenlign JSON validerer JSON i browseren med JSON.parse—ikke eval.

Valider, pynt med 2 mellemrum, 4 mellemrum eller tabulator, minify, kopiér, download og upload .json. JSON Diff dækker indlejrede objekter og arrays, stier, opsummering, filtre og byt. Efter parse sammenlignes pyntet og minificeret kopi af de samme data som ens; objektnøgler sammenlignes på navn.

Tekst større end 5 MB kan føles langsom. Tekst større end 15 MB behandles ikke i browseren.

JSON-validering og formatering sker i din browser. Dette værktøj sender ikke JSON til en NEXNARA-server. Annoncer og andre sitefunktioner bruger stadig netværket.

Indsæt den fejlende streng i Formatér og sammenlign JSON, og læs de første tegn, før du omskriver anførselstegn.

FAQ

Hvorfor siger JSON.parse Unexpected token?

Teksten er ikke gyldig JSON på det punkt, hvor parseren stoppede. Typiske årsager er anførselstegn, kommaer, ekstra tekst eller en ikke-JSON-krop som HTML.

Hvad betyder Unexpected token < in JSON?

Det første ulovlige tegn kan være <. Det peger ofte på en HTML-side, men det er ikke bevis for en 404 eller for HTML i alle tilfælde. Tjek status, Content-Type og den rå krop.

Hvordan finder jeg fejlpositionen i JSON?

Hvis motoren rapporterer en position, linje eller kolonne, så kig i nærheden. Den rigtige fejl kan sidde tidligere. Brug den som hint, og valider derefter.

Kan JSON bruge enkelte anførselstegn?

Nej. I standard-JSON bruger strenge og medlemsnavne dobbelte anførselstegn.

Kan JSON have afsluttende kommaer?

Nej. Standard-JSON tillader ikke et komma efter den sidste egenskab eller det sidste array-element.

Hvordan tjekker jeg, om en streng er gyldig JSON?

Kald JSON.parse i en try/catch, eller indsæt teksten i Formatér og sammenlign JSON. Hvis parsningen kaster SyntaxError, er strengen ikke gyldig JSON.