Tech Help

Miksi JSON.parse sanoo "Unexpected token"?

JSON.parse heittää Unexpected tokenin, kun teksti ei ole kelvollista JSON:ia. Selvitä yksittäiset lainausmerkit, perässä oleva pilkku, HTML-vastaukset ja virheen sijainti.

Pikavastaus

JSON.parse() heittää SyntaxErrorin, kun syöte ei ole kelvollista JSON:ia. ”Unexpected token” tarkoittaa yleensä, että jäsennin saavutti merkin, jota ei sallita siinä kohdassa rakennetta.

Yleisiä syitä ovat yksittäiset lainausmerkit, perässä oleva pilkku, lainausmerkitön ominaisuusnimi, virheellinen merkkijonon escape, ylimääräinen teksti JSON:n ympärillä tai HTML:n tai muun ei-JSON-rungon jäsentäminen JSON:ina.

Virheen tarkka sanamuoto vaihtelee JavaScript-moottorin ja selaimen mukaan. Älä oleta, että jokainen ajonaikainen ympäristö tulostaa ”Unexpected token X in JSON at position N”.

Tämä on JSON.parse Unexpected token -selvitystä: mitä virhe merkitsee, miten sijainti luetaan ja mitä tehdään, kun runko on HTML. Perässä olevan pilkun, lainausmerkkien ja Unexpected endin laajempi käsittely on Yleiset JSON-virheet: perässä oleva pilkku, lainausmerkit ja Unexpected token:ssä.

Mitä “Unexpected token” tarkoittaa JSON.parse()-kutsussa?

JSON.parse() vaatii JSON-kielioppia. Laiton merkki nykyisessä kohdassa heittää SyntaxErrorin. {“name”:“Alex”,} on virheellinen: tuon pilkun jälkeen olio ei voi päättyä. Viestin teksti ja sijainti vaihtelevat yhä ajonaikaisen ympäristön mukaan.

Minkä virheen JSON.parse() heittää?

Virheellinen JSON heittää yleensä SyntaxErrorin. Kirjaa error.name tyypin varmistamiseksi. Älä kovakoodaa koko error.message-tekstiä: moottorit ja versiot muotoilevat sen eri tavoin.

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

1. Yksittäiset lainausmerkit kaksoisten sijaan

{‘name’:‘Alex’} on virheellistä JSON:ia. {“name”:“Alex”} on kelvollista. JSON-merkkijonot ja olion jäsenten nimet käyttävät kaksoislainausmerkkejä. JavaScript-olioliteraali kuten const user = { name: ‘Alex’ } voi olla laillista JavaScriptiä eikä silti ole JSON-tekstiä.

Virheellinen

{'name':'Alex'}

Kelvollinen

{"name":"Alex"}

2. Perässä olevat pilkut

Pilkku viimeisen ominaisuuden tai taulukon alkion jälkeen ei ole kelvollista standard-JSON:ia. {“name”:“Alex”,“age”:30,} ja [1, 2, 3,] epäonnistuvat molemmat. Käsittele tätä yhtenä Unexpected token -syynä; Yleiset JSON-virheet: perässä oleva pilkku, lainausmerkit ja Unexpected token käsittelee perässä olevaa pilkkua syvemmin.

Virheellinen

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

Kelvollinen

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

3. Lainausmerkitön ominaisuusnimi

{ name: “Alex” } voi olla JavaScript-olioliteraali. JSON:ssa olion jäsenten nimet ovat merkkijonoja ja tarvitsevat kaksoislainausmerkit: {“name”:“Alex”}.

Virheellinen

{
  name: "Alex"
}

Kelvollinen

{
  "name": "Alex"
}

4. Virheellinen merkkijonon escape

JSON-tekstissä kenoviiva aloittaa escapen. Raaka polku kuten C:\Users\Alex on virheellinen, koska \U ei ole laillinen escape. Kaksinkertaista kenoviivat. Älä sekoita isäntäkielen merkkijonon escapea JSON-escapeen. Yleiset JSON-virheet: perässä oleva pilkku, lainausmerkit ja Unexpected token käsittelee tätä syvemmin.

Virheellinen

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

Kelvollinen

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

5. Ylimääräinen teksti ennen JSON:ia tai sen jälkeen

JSON.parse odottaa yhtä JSON-arvoa. Etuliite kuten Success: ennen {“ok”:true}-arvoa, tai jälkiliite kuten done sen jälkeen, tekee koko merkkijonosta virheellisen. Merkityksetön whitespace yhden JSON-arvon ympärillä on sallittu. JSON ei kiellä välilyöntejä arvon edessä tai jälkeen.

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

6. HTML:n jäsentäminen JSON:in sijaan

response.json()-kutsu HTML-sivulle on yleinen Unexpected token -tapaus. Väärät endpointit, 404- tai 500-HTML-sivut, kirjautumisohjaukset, välitysrungot ja varasivut alkavat usein merkinnällä. ”Unexpected token < tarkoittaa aina HTML:ää” on liian jyrkkä: < on vihje, ei todiste.

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

Mitä “Unexpected token <” yleensä tarkoittaa?

JSON-arvot eivät tavallisesti ala merkillä <. Jos runko alkaa merkillä tai , < voi olla ensimmäinen laiton merkki. Paikallisessa selvityksessä tarkista HTTP-tila, Content-Type ja raaka runko. Moottorin sanamuoto vaihtelee yhä.

Tarkista vastaus ennen jäsentämistä

fetch-rungon voi kuluttaa vain kerran. Paikallisessa selvityksessä lue ensin text(), tarkasta lyhyt alku ja aja sitten JSON.parse samalle merkkijonolle. Älä kutsu response.json() ja sen jälkeen response.text() samalle vastaukselle. Älä kirjaa arkaluontoisia tuotantokuormia oletuksena.

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ä “at position 123” tarkoittaa?

Jotkin moottorit ilmoittavat sijainnin, rivin tai sarakkeen. Etsi läheltä huonoa lainausmerkkiä, pilkkua, aaltosuljetta tai escapea. Indeksi on kohta, jossa jäsennys huomasi ongelman; todellinen syy voi olla aiempana. Se ei ole taatusti juuri viallinen merkki.

Unexpected token ja Unexpected end

Unexpected token tarkoittaa, että jäsennin tapasi merkin, jota se ei odottanut. Unexpected end voi näkyä, kun syöte loppuu ennen kuin arvo on valmis, kuten {“name”:“Alex” ilman sulkevaa aaltosuljetta. Tarkka sanamuoto riippuu moottorista. Yleiset JSON-virheet: perässä oleva pilkku, lainausmerkit ja Unexpected token käsittelee keskeneräistä JSON:ia laajemmin.

{"name":"Alex"

JSON ei ole sama kuin JavaScript-olioliteraali

JSON on dataformaatti. JavaScript-olioliteraali on JavaScript-syntaksia. JS-olio, jossa on lainausmerkitön avain, yksittäiset lainausmerkit ja perässä oleva pilkku, ei ole kelvollista JSON-tekstiä. JSON.parse ei voi jäsentää JavaScript-olioliteraaleja turvallisesti.

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

Voiko JSON sisältää kommentteja?

Standard-JSON ei tue kommentteja. // rivi olion sisällä on virheellinen. JSON5 ja vastaavat laajennukset ovat eri formaatteja. JSON-muotoilu ja vertailu validoi standard-JSON:n JSON.parse-metodilla eikä käsittele JSON5:tä JSON:ina.

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

Ovatko undefined, NaN ja Infinity kelvollista JSON:ia?

Eivät. JSON-arvot ovat olio, taulukko, merkkijono, luku, true, false ja null. undefined, NaN ja Infinity eivät ole. Huipputason arvon ei tarvitse olla olio tai taulukko: true, 123, “hello” ja null ovat kelvollista JSON:ia.

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

Näin korjaat Unexpected token -virheen vaiheittain

Työstä lähdettä, älä virhemerkkijonoa:

  1. Varmista, että syöte on tosiaan JSON:ia, ei HTML:ää, lokeja tai JavaScriptiä.
  2. Tarkasta raakasäytteen ensimmäiset merkit.
  3. Jos se tuli API:sta, tarkista HTTP-tila ja Content-Type. Eivät 200 eikä application/json takaa kelvollista JSON:ia.
  4. Validoi syntaksi JSON-jäsentimessä.
  5. Käytä ilmoitettua sijaintia, riviä tai saraketta vihjeenä, ei taattuna juurisyynä.
  6. Tarkista lainausmerkit, pilkut, aaltosulkeet, hakasulkeet ja escapet sen alueen läheltä.
  7. Vertaa muotoiltuun, validoituun kopioon.
  8. Korjaa serialisoija tai endpoint. Älä poista ilmoitettua tokenia umpimähkään.
Älä "korjaa" JSON:ia vaihtamalla lainausmerkkejä umpimähkään

Globaali ' → " -vaihto voi rikkoa heittomerkit merkkijonojen sisällä, jo escapoidun tekstin ja lähteet, jotka eivät ole JSON:ia. Tuota kelvollista JSON:ia oikeasta serialisoijasta. Älä käsittele eval JSON-jäsentimenä.

Käytä JSON.stringify()-metodia, kun tuotat JSON:ia JavaScriptissä

Suosi JSON.stringify-metodia käsin ketjuttamisen sijaan. Se tuottaa kelvollista JSON-tekstiä serialisoimilleen arvoille. Se ei säilytä jokaista JavaScript-arvoa: undefined, funktiot ja symbolit käyttäytyvät erityisellä tavalla. Se yksityiskohta jää tämän tekstin ulkopuolelle.

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

Virheellinen JSON ja oikea korjaus

Nämä parit tarkistettiin JSON.parse-metodilla. HTML:ssä korjaus on vastaus, ei syntaksin muokkaus.

Ongelma Virheellinen Korjaus
Yksittäiset lainausmerkit {'a':1} {"a":1}
Perässä oleva pilkku {"a":1,} {"a":1}
Lainausmerkitön avain {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
HTML-runko <html>... Tarkista endpoint ja raaka vastaus. Älä muokkaa HTML:ää JSON:iksi.

Yksinkertainen Unexpected token -päätösopas

Jos JSON.parse epäonnistui, päätä ensin, onko sinulla edes JSON:ia, ennen kuin kirjoitat lainausmerkit uudelleen.

  • JSON.parse epäonnistui
  • API:sta? Tarkista tila, Content-Type ja raaka runko
  • Alkaako se JSON:ina? Jos ei, korjaa lähde tai endpoint
  • Jos kyllä, validoi lainausmerkit, pilkut, aaltosulkeet, hakasulkeet, escapet, tukemattomat arvot
  • Käytä ilmoitettua sijaintia vihjeenä
  • Korjaa lähde ja jäsennä uudelleen
Unexpected token nimeää yllätyksen. Tekstin lähde on usein oikea korjaus.

Validoi JSON ennen jäsentämistä tai käyttöä

NEXNARA JSON-muotoilu ja vertailu validoi JSON:n selaimessa JSON.parse-metodilla—ei eval.

Validoi, kaunista 2 välilyönnillä, 4 välilyönnillä tai sarkaimella, minify, kopioi, lataa ja lähetä .json. JSON Diff kattaa sisäkkäiset oliot ja taulukot, polut, yhteenvedon, suodattimet ja vaihdon. Jäsennyksen jälkeen saman datan kaunis ja minifioitu kopio vertautuvat yhtä suuriksi; olioavaimet vertautuvat nimen mukaan.

Yli 5 MB teksti voi tuntua hitaalta. Yli 15 MB tekstiä ei käsitellä selaimessa.

JSON:n validointi ja muotoilu tapahtuvat selaimessasi. Tämä työkalu ei lähetä JSON:ia NEXNARA-palvelimelle. Mainokset ja muut sivuston ominaisuudet käyttävät yhä verkkoa.

Liitä epäonnistuva merkkijono JSON-muotoilu ja vertailu-työkaluun ja lue ensimmäiset merkit ennen lainausmerkkien uudelleenkirjoitusta.

FAQ

Miksi JSON.parse sanoo Unexpected token?

Teksti ei ole kelvollista JSON:ia kohdassa, jossa jäsennin pysähtyi. Tyypillisiä syitä ovat lainausmerkit, pilkut, ylimääräinen teksti tai ei-JSON-runko kuten HTML.

Mitä Unexpected token < in JSON tarkoittaa?

Ensimmäinen laiton merkki voi olla <. Se viittaa usein HTML-sivuun, mutta se ei ole todiste 404:stä eikä HTML:stä joka tapauksessa. Tarkista tila, Content-Type ja raaka runko.

Miten löydän virheen sijainnin JSON:ssa?

Jos moottori ilmoittaa sijainnin, rivin tai sarakkeen, katso läheltä. Todellinen virhe voi olla aiempana. Käytä sitä vihjeenä ja validoi sitten.

Voiko JSON käyttää yksittäisiä lainausmerkkejä?

Ei. Standard-JSON:ssa merkkijonot ja jäsenten nimet käyttävät kaksoislainausmerkkejä.

Voiko JSON:ssa olla perässä oleva pilkku?

Ei. Standard-JSON ei salli pilkkua viimeisen ominaisuuden tai taulukon alkion jälkeen.

Miten tarkistan, onko merkkijono kelvollista JSON:ia?

Kutsu JSON.parse try/catch-lohossa tai liitä teksti JSON-muotoilu ja vertailu-työkaluun. Jos jäsennys heittää SyntaxErrorin, merkkijono ei ole kelvollista JSON:ia.