Tech Help

Kwa nini JSON.parse inasema "Unexpected token"?

JSON.parse hutupa Unexpected token wakati maandishi si JSON halali. Tatua nukuu moja, koma ya mwisho, majibu ya HTML, na nafasi ya kosa.

Jibu la haraka

JSON.parse() hutupa SyntaxError wakati ingizo si JSON halali. “Unexpected token” kwa ujumla inamaanisha kichanganuzi kilifika herufi isiyoruhusiwa katika hatua hiyo ya muundo.

Sababu za kawaida ni pamoja na nukuu moja, koma ya mwisho, majina ya sifa bila nukuu, escape batili ya mstari, maandishi ya ziada karibu na JSON, au kuchanganua HTML au mwili mwingine usio JSON kama JSON.

Maneno kamili ya kosa hutofautiana kulingana na injini ya JavaScript na kivinjari. Usidhani kila mazingira ya utekelezaji huchapisha “Unexpected token X in JSON at position N”.

Hii ni utatuzi wa Unexpected token wa JSON.parse: kosa linamaanisha nini, jinsi ya kusoma nafasi, na cha kufanya mwili ni HTML. Chanjo pana zaidi ya koma ya mwisho, nukuu, na Unexpected end iko katika Makosa ya kawaida ya JSON: koma ya mwisho, alama za nukuu na Unexpected token.

“Unexpected token” inamaanisha nini katika JSON.parse()?

JSON.parse() inahitaji sarufi ya JSON. Herufi haramu katika nafasi ya sasa hutupa SyntaxError. {“name”:“Alex”,} ni batili: baada ya koma hiyo kitu hakiwezi kuisha. Maandishi ya ujumbe na nafasi bado hutofautiana kulingana na mazingira ya utekelezaji.

JSON.parse() hutupa kosa gani?

JSON batili kwa ujumla hutupa SyntaxError. Rekodi error.name ili kuthibitisha aina. Usiandike error.message kamili kwa uthabiti: injini na matoleo huyatumia maneno tofauti.

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

1. Kutumia nukuu moja badala ya nukuu mbili

{‘name’:‘Alex’} ni JSON batili. {“name”:“Alex”} ni halali. Mistari ya JSON na majina ya wanachama wa kitu hutumia nukuu mbili. Literali ya kitu cha JavaScript kama const user = { name: ‘Alex’ } inaweza kuwa JavaScript halali na bado isiwe maandishi ya JSON.

Batili

{'name':'Alex'}

Halali

{"name":"Alex"}

2. Koma za mwisho

Koma baada ya sifa au kipengee cha mwisho cha safu si JSON sanifu halali. {“name”:“Alex”,“age”:30,} na [1, 2, 3,] zote zinashindwa. Ichukulie kama sababu moja ya Unexpected token; Makosa ya kawaida ya JSON: koma ya mwisho, alama za nukuu na Unexpected token inashughulikia koma za mwisho kwa kina zaidi.

Batili

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

Halali

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

3. Majina ya sifa bila nukuu

{ name: “Alex” } inaweza kuwa literali ya kitu cha JavaScript. Katika JSON, majina ya wanachama ni mistari na yanahitaji nukuu mbili: {“name”:“Alex”}.

Batili

{
  name: "Alex"
}

Halali

{
  "name": "Alex"
}

4. Escape batili ya mstari

Katika maandishi ya JSON mstari wa nyuma huanza escape. Njia ghafi kama C:\Users\Alex ni batili kwa sababu \U si escape halali. Rudufisha mistari ya nyuma. Usichanganye escape ya lugha-mwenyeji na escape ya JSON. Makosa ya kawaida ya JSON: koma ya mwisho, alama za nukuu na Unexpected token inashughulikia hii kwa kina zaidi.

Batili

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

Halali

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

5. Maandishi ya ziada kabla au baada ya JSON

JSON.parse inatarajia thamani moja ya JSON. Kiambishi awali kama Success: kabla ya {“ok”:true}, au kiambishi tamati kama done baada yake, hufanya mstari wote batili. Nafasi nyeupe isiyo na maana karibu na thamani moja ya JSON inaruhusiwa. JSON inaruhusiwa kuwa na nafasi kabla au baada ya thamani.

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

6. Kuchanganua HTML badala ya JSON

Kuita response.json() kwenye ukurasa wa HTML ni kesi ya kawaida ya Unexpected token. Endpoint zisizo sahihi, kurasa za HTML 404 au 500, uelekezaji wa kuingia, miili ya proksi, na kurasa mbadala mara nyingi huanza na alama. “Unexpected token < daima inamaanisha HTML” ni kali mno: < ni kidokezo, si uthibitisho.

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

“Unexpected token <” kwa kawaida inamaanisha nini?

Thamani za JSON kwa kawaida hazianzi na <. Ikiwa mwili unaanza na au , < inaweza kuwa herufi haramu ya kwanza. Wakati wa utatuzi wa ndani, kagua hali ya HTTP, Content-Type, na mwili ghafi. Maneno ya injini bado hutofautiana.

Kagua jibu kabla ya kulichanganua

Mwili wa fetch unaweza kutumika mara moja tu. Wakati wa utatuzi wa ndani, soma text() kwanza, kagua kiambishi awali kifupi, kisha JSON.parse mstari ule ule. Usiite response.json() kisha response.text() kwenye jibu lile lile. Usirekodi mizigo nyeti ya uzalishaji kwa chaguo-msingi.

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

“at position 123” inamaanisha nini?

Baadhi ya injini huripoti nafasi, mstari, au safu. Tafuta karibu nukuu, koma, bano, au escape mbaya. Kielezo hicho ni mahali uchanganuzi uliona tatizo; sababu halisi inaweza kuwa mapema. Haihakikishiwi kuwa herufi yenye hitilafu kamili.

Unexpected token vs Unexpected end

Unexpected token inamaanisha kichanganuzi kilikutana na herufi ambayo hakuitarajia. Unexpected end inaweza kuonekana wakati ingizo linasimama kabla thamani haijakamilika, kama katika {“name”:“Alex” bila bano la kufunga. Maneno kamili yanategemea injini. Makosa ya kawaida ya JSON: koma ya mwisho, alama za nukuu na Unexpected token inashughulikia JSON isiyokamilika kwa upana zaidi.

{"name":"Alex"

JSON si sawa na literali ya kitu cha JavaScript

JSON ni umbizo la data. Literali ya kitu cha JavaScript ni sintaksia ya JavaScript. Kitu cha JS chenye funguo bila nukuu, nukuu moja, na koma ya mwisho si maandishi ya JSON halali. JSON.parse haiwezi kuchanganua kwa usalama literali za vitu vya JavaScript.

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

Je, JSON inaweza kuwa na maoni?

JSON sanifu haiungi mkono maoni. Mstari wa // ndani ya kitu ni batili. JSON5 na viendelezi vinavyofanana ni umbizo tofauti. Panga na linganisha JSON huthibitisha JSON sanifu kwa JSON.parse na haitii JSON5 kama JSON.

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

Je, undefined, NaN, na Infinity ni JSON halali?

Hapana. Thamani za JSON ni kitu, safu, mstari, nambari, true, false, na null. undefined, NaN, na Infinity si. Thamani ya juu si lazima iwe kitu au safu: true, 123, “hello”, na null ni JSON halali.

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

Jinsi ya kurekebisha kosa la Unexpected token hatua kwa hatua

Fanya kazi kwenye chanzo, si mstari wa kosa:

  1. Thibitisha ingizo ni JSON kweli, si HTML, kumbukumbu, au JavaScript.
  2. Kagua herufi za kwanza za ingizo ghafi.
  3. Ikiwa ilitoka API, kagua hali ya HTTP na Content-Type. Wala 200 wala application/json haihakikishi JSON halali.
  4. Thibitisha sintaksia katika kichanganuzi cha JSON.
  5. Tumia nafasi, mstari, au safu iliyoripotiwa kama kidokezo, si kama sababu ya mizizi iliyohakikishwa.
  6. Kagua nukuu, koma, mabano, mabano ya mraba, na escape karibu na eneo hilo.
  7. Linganisha na nakala iliyopambwa na kuthibitishwa.
  8. Rekebisha kisimbaji au endpoint. Usifute tokeni iliyoripotiwa kwa nasibu.
Usirekebishe JSON kwa kubadilisha nukuu kwa nasibu

Ubadilishaji wa kimataifa wa ' na " unaweza kuvunja apostrofi ndani ya mistari, maandishi yaliyokwisha escape, na vyanzo visivyo JSON. Zalisha JSON halali kutoka kisimbaji cha kweli. Usichukulie eval kama kichanganuzi cha JSON.

Tumia JSON.stringify() unapozalisha JSON katika JavaScript

Pendelea JSON.stringify kuliko kuunganisha mistari kwa mkono. Hutoa maandishi ya JSON halali kwa thamani inazosimba. Haihifadhi kila thamani ya JavaScript: undefined, kazi, na alama zina tabia maalum. Maelezo hayo yapo nje ya wigo hapa.

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

JSON batili vs marekebisho ya kweli

Jozi hizi zilikaguliwa kwa JSON.parse. Kwa HTML, marekebisho ni jibu, si hariri ya sintaksia.

Tatizo Batili Marekebisho
Nukuu moja {'a':1} {"a":1}
Koma ya mwisho {"a":1,} {"a":1}
Ufunguo bila nukuu {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
Mwili wa HTML <html>... Kagua endpoint na jibu ghafi. Usihariri HTML kuwa JSON.

Mwongozo rahisi wa uamuzi wa Unexpected token

Ikiwa JSON.parse ilishindwa, amua kama una JSON kabla ya kuandika upya nukuu.

  • JSON.parse ilishindwa
  • Kutoka API? Kagua hali, Content-Type, na mwili ghafi
  • Inaanza na JSON? Ikiwa sivyo, rekebisha chanzo au endpoint
  • Ikiwa ndiyo, thibitisha nukuu, koma, mabano, mabano ya mraba, escape, thamani zisizoungwa mkono
  • Tumia nafasi iliyoripotiwa kama kidokezo
  • Rekebisha chanzo, kisha changanua tena
Unexpected token inataja mshangao. Chanzo cha maandishi mara nyingi ndicho marekebisho ya kweli.

Thibitisha JSON kabla ya kuchanganua au kuitumia

NEXNARA Panga na linganisha JSON huthibitisha JSON katika kivinjari kwa JSON.parse—si eval.

Thibitisha, pamba kwa nafasi 2, nafasi 4, au vichupo, minify, nakili, pakua, na pakia .json. JSON Diff inashughulikia vitu na safu zilizowekwa ndani, njia, muhtasari, vichujio, na kubadilisha. Baada ya kuchanganua, nakala zilizopambwa na minify za data ile ile hulinganishwa kuwa sawa; funguo za vitu hulinganishwa kwa jina.

Maandishi makubwa kuliko 5 MB yanaweza kuhisi polepole. Maandishi makubwa kuliko 15 MB hayachakatwi katika kivinjari.

Uthibitishaji na umbizo la JSON hutokea katika kivinjari chako. Zana hii haitumi JSON kwa seva ya NEXNARA. Matangazo na vipengele vingine vya tovuti bado vinatumia mtandao.

Bandika mstari ulioshindwa katika Panga na linganisha JSON na usome herufi za kwanza kabla ya kuandika upya nukuu.

FAQ

Kwa nini JSON.parse inasema Unexpected token?

Maandishi si JSON halali katika hatua kichanganuzi kilisimama. Sababu za kawaida ni nukuu, koma, maandishi ya ziada, au mwili usio JSON kama HTML.

Unexpected token < katika JSON inamaanisha nini?

Herufi haramu ya kwanza inaweza kuwa <. Hiyo mara nyingi inaelekeza ukurasa wa HTML, lakini si uthibitisho wa 404 au wa HTML katika kila kesi. Kagua hali, Content-Type, na mwili ghafi.

Ninawezaje kupata nafasi ya kosa katika JSON?

Ikiwa injini inaripoti nafasi, mstari, au safu, angalia karibu. Kosa halisi linaweza kuwa mapema. Itumie kama kidokezo, kisha thibitisha.

Je, JSON inaweza kutumia nukuu moja?

Hapana. Mistari ya JSON sanifu na majina ya wanachama hutumia nukuu mbili.

Je, JSON inaweza kuwa na koma za mwisho?

Hapana. JSON sanifu hairuhusu koma baada ya sifa au kipengee cha mwisho cha safu.

Ninawezaje kukagua kama mstari ni JSON halali?

Ita JSON.parse katika try/catch, au bandika maandishi katika Panga na linganisha JSON. Ikiwa uchanganuzi unatupa SyntaxError, mstari si JSON halali.