Tech Help

JSON.parse niyə "Unexpected token" deyir?

JSON.parse mətn etibarlı JSON olmayanda Unexpected token atır. Tək dırnaq, son vergül, HTML cavabları və xəta mövqeyini sazlayın.

Qısa cavab

JSON.parse() giriş etibarlı JSON olmayanda SyntaxError atır. “Unexpected token” adətən parserin strukturun o nöqtəsində icazə verilməyən simvola çatması deməkdir.

Ümumi səbəblər: tək dırnaq, son vergül, dırnaqsız xassə adları, səhv sətir qaçışı, JSON ətrafında artıq mətn, və ya HTML yaxud başqa JSON olmayan gövdəni JSON kimi ayırmaq.

Xətanın dəqiq ifadəsi JavaScript mühərriki və brauzerdən asılı dəyişir. Hər runtime-ın «Unexpected token X in JSON at position N» çap etdiyini güman etməyin.

Bu JSON.parse-də Unexpected token sazlamasıdır: xəta nə deməkdir, mövqeyi necə oxumaq, gövdə HTML olanda nə etmək. Son vergül, dırnaq və Unexpected end daha geniş Ümumi JSON xətaları: son vergül, dırnaq və Unexpected token-dədir.

JSON.parse()-də “Unexpected token” nə deməkdir?

JSON.parse() JSON qrammatikasını tələb edir. Cari mövqedəki qanunsuz simvol SyntaxError atır. {“name”:“Alex”,} etibarsızdır: o vergülündən sonra obyekt bitə bilməz. Mesaj mətni və mövqe hələ runtime-a görə dəyişir.

JSON.parse() hansı xətanı atır?

Etibarsız JSON ümumən SyntaxError atır. Növü təsdiqləmək üçün error.name yazın. error.message-in hamısını sərt kodlamayın: mühərriklər və versiyalar fərqli ifadə edir.

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

1. Cüt dırnaq əvəzinə tək dırnaq

{‘name’:‘Alex’} etibarsız JSON-dur. {“name”:“Alex”} etibarlıdır. JSON sətirləri və obyekt üzv adları cüt dırnaq istifadə edir. const user = { name: ‘Alex’ } kimi JavaScript obyekt literalı qanuni JavaScript ola bilər, amma yenə JSON mətni olmaya bilər.

Etibarsız

{'name':'Alex'}

Etibarlı

{"name":"Alex"}

2. Son vergüllər

Son xassədən və ya massiv elementindən sonra vergül etibarlı standart JSON deyil. {“name”:“Alex”,“age”:30,} və [1, 2, 3,] hər ikisi uğursuz olur. Bunu Unexpected token səbəbi sayın; Ümumi JSON xətaları: son vergül, dırnaq və Unexpected token son vergülləri daha dərindən əhatə edir.

Etibarsız

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

Etibarlı

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

3. Dırnaqsız xassə adları

{ name: “Alex” } JavaScript obyekt literalı ola bilər. JSON-da üzv adları sətirlərdir və cüt dırnaq lazımdır: {“name”:“Alex”}.

Etibarsız

{
  name: "Alex"
}

Etibarlı

{
  "name": "Alex"
}

4. Etibarsız sətir qaçışı

JSON mətnində tərs slash qaçış başladır. C:\Users\Alex kimi xam yol etibarsızdır, çünki \U qanuni qaçış deyil. Tərs slashları ikiqat edin. Ev sahibi dilinin qaçışını JSON qaçışı ilə qarışdırmayın. Ümumi JSON xətaları: son vergül, dırnaq və Unexpected token bunu daha dərindən əhatə edir.

Etibarsız

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

Etibarlı

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

5. JSON-dan əvvəl və ya sonra artıq mətn

JSON.parse bir JSON dəyəri gözləyir. {“ok”:true} qarşısında Success: kimi prefiks, və ya arxasında done kimi suffiks, bütün sətri etibarsız edir. Tək JSON dəyərinin ətrafındakı əhəmiyyətsiz boşluq icazəlidir. JSON dəyərdən əvvəl və ya sonra boşluğu qadağan etmir.

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

6. JSON əvəzinə HTML ayırmaq

HTML səhifəyə response.json() çağırmaq ümumi Unexpected token haldır. Səhv endpointlər, 404 və ya 500 HTML səhifələri, giriş yönləndirmələri, proksi gövdələri və ehtiyat səhifələr çox vaxt nişanla başlayır. «Unexpected token < həmişə HTML deməkdir» həddən artıq güclüdür: < işarədir, sübut deyil.

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

“Unexpected token <” adətən nə deməkdir?

JSON dəyərləri adətən < ilə başlamır. Gövdə və ya ilə başlayırsa, < birinci qanunsuz simvol ola bilər. Yerli sazlamada HTTP statusuna, Content-Type-a və xam gövdəyə baxın. Mühərrik ifadəsi hələ dəyişir.

Ayırmadan əvvəl cavabı yoxlayın

fetch gövdəsi yalnız bir dəfə sərf oluna bilər. Yerli sazlamada əvvəl text() oxuyun, qısa prefiksə baxın, sonra eyni sətrə JSON.parse tətbiq edin. Eyni cavaba əvvəl response.json(), sonra response.text() çağırmayın. İstehsalda həssas yükləri standart olaraq jurnal etməyin.

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” nə deməkdir?

Bəzi mühərriklər mövqe, sətir və ya sütun bildirir. Yaxınlıqda səhv dırnaq, vergül, mötərizə və ya qaçış axtarın. Həmin indeks parserin problemi gördüyü yerdir; həqiqi səbəb daha əvvəl ola bilər. Dəqiq nasaz simvol olduğu zəmanət deyil.

Unexpected token Unexpected end-ə qarşı

Unexpected token parserin gözləmədiyi simvola rast gəlməsi deməkdir. Unexpected end giriş dəyər tamamlanmadan dayandıqda görünə bilər, məsələn {“name”:“Alex” bağlanış mötərizəsiz. Dəqiq ifadə mühərrikdən asılıdır. Ümumi JSON xətaları: son vergül, dırnaq və Unexpected token natamam JSON-u daha geniş əhatə edir.

{"name":"Alex"

JSON JavaScript obyekt literalı ilə eyni deyil

JSON verilənlər formatıdır. JavaScript obyekt literalı JavaScript sintaksisidir. Dırnaqsız açarları, tək dırnağı və son vergülü olan JS obyekti etibarlı JSON mətni deyil. JSON.parse JavaScript obyekt literallarını təhlükəsiz ayıra bilməz.

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

JSON şərh saxlaya bilərmi?

Standart JSON şərhləri dəstəkləmir. Obyekt içində // sətri etibarsızdır. JSON5 və oxşar genişlənmələr başqa formatlardır. JSON formatlayıcı və müqayisə standart JSON-u JSON.parse ilə yoxlayır və JSON5-i JSON saymır.

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

undefined, NaN və Infinity etibarlı JSON-dur?

Xeyr. JSON dəyərləri obyekt, massiv, sətir, ədəd, true, false və null-dur. undefined, NaN və Infinity deyil. Üst səviyyə dəyər obyekt və ya massiv olmaq məcburiyyətində deyil: true, 123, “hello” və null etibarlı JSON-dur.

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

Unexpected token xətasını addım-addım necə düzəltmək

Xəta sətri ilə yox, mənbə ilə işləyin:

  1. Girişin həqiqətən JSON olduğunu təsdiqləyin, HTML, jurnallar və ya JavaScript yox.
  2. Xam girişin ilk simvollarına baxın.
  3. API-dən gəlibsə, HTTP statusu və Content-Type yoxlayın. Nə 200, nə application/json etibarlı JSON zəmanət vermir.
  4. Sintaksisi JSON parserində yoxlayın.
  5. Bildirilən mövqe, sətir və ya sütunu ipucu kimi istifadə edin, zəmanətli kök səbəb kimi yox.
  6. Həmin sahənin yaxınlığında dırnaq, vergül, mötərizə, kvadrat mötərizə və qaçışlara baxın.
  7. Formatlanmış, yoxlanmış nüsxə ilə müqayisə edin.
  8. Serializatoru və ya endpoint-i düzəldin. Bildirilən tokeni təsadüfi silməyin.
JSON-u təsadüfi dırnaq əvəzləməklə «düzəltməyin»

'-ni " ilə qlobal əvəzləmək sətir içindəki apostrofları, artıq qaçırılmış mətni və JSON olmayan mənbələri poza bilər. Etibarlı JSON-u real serializatordan hasil edin. eval-ı JSON parseri saymayın.

JavaScript-də JSON hasil edəndə JSON.stringify() istifadə edin

Sətirləri əl ilə birləşdirməkdənsə JSON.stringify üstün tutun. Serializə etdiyi dəyərlər üçün etibarlı JSON mətni çıxarır. Hər JavaScript dəyərini saxlamır: undefined, funksiyalar və simvolların xüsusi davranışı var. Bu detal burada əhatədən kənardır.

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

Etibarsız JSON həqiqi düzəlişə qarşı

Bu cütlər JSON.parse ilə yoxlandı. HTML üçün düzəliş cavabdır, sintaksis redaktəsi deyil.

Problem Etibarsız Düzəliş
Tək dırnaq {'a':1} {"a":1}
Son vergül {"a":1,} {"a":1}
Dırnaqsız açar {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
HTML gövdəsi <html>... Endpoint-i və xam cavabı yoxlayın. HTML-i JSON-a redaktə etməyin.

Unexpected token üçün sadə qərar bələdçisi

JSON.parse uğursuz olsa, dırnaqları yenidən yazmazdan əvvəl ümumiyyətlə JSON-unuz olub-olmadığına qərar verin.

  • JSON.parse uğursuz oldu
  • API-dən? Status, Content-Type və xam gövdəni yoxlayın
  • JSON ilə başlayır? Yoxdursa, mənbəni və ya endpoint-i düzəldin
  • Bəli isə, dırnaq, vergül, mötərizə, kvadrat mötərizə, qaçış, dəstəklənməyən dəyərləri yoxlayın
  • Bildirilən mövqeyi ipucu kimi istifadə edin
  • Mənbəni düzəldin, sonra yenidən ayırın
Unexpected token sürprizi adlandırır. Mətnin mənbəyi çox vaxt həqiqi düzəlişdir.

Ayırmadan və ya istifadə etməzdən əvvəl JSON-u yoxlayın

NEXNARA JSON formatlayıcı və müqayisə brauzerdə JSON-u JSON.parse ilə yoxlayır—eval yox.

Yoxlayın, 2 boşluq, 4 boşluq və ya tab ilə gözəlləşdirin, minify edin, kopyalayın, endirin və .json yükləyin. JSON Diff iç-içə obyekt və massivləri, yolları, xülasəni, filtrləri və dəyişməni əhatə edir. Ayırmadan sonra eyni məlumatın gözəlləşdirilmiş və minify nüsxələri bərabər müqayisə olunur; obyekt açarları ada görə müqayisə edilir.

5 MB-dan böyük mətn yavaş görünə bilər. 15 MB-dan böyük mətn brauzerdə işlənmır.

JSON yoxlama və formatlama brauzerinizdə baş verir. Bu alət JSON-u NEXNARA serverinə göndərmir. Reklamlar və saytın digər funksiyaları hələ şəbəkə istifadə edir.

Uğursuz sətri JSON formatlayıcı və müqayisə içinə yapışdırın və dırnaqları yenidən yazmazdan əvvəl ilk simvolları oxuyun.

FAQ

JSON.parse niyə Unexpected token deyir?

Mətn parserin dayandığı nöqtədə etibarlı JSON deyil. Tipik səbəblər dırnaq, vergül, artıq mətn və ya HTML kimi JSON olmayan gövdədir.

Unexpected token < in JSON nə deməkdir?

Birinci qanunsuz simvol < ola bilər. Bu çox vaxt HTML səhifəyə işarə edir, amma hər halda 404 və ya HTML sübutu deyil. Status, Content-Type və xam gövdəni yoxlayın.

JSON-da xəta mövqeyini necə tapım?

Mühərrik mövqe, sətir və ya sütun bildirirsə, yaxınlığa baxın. Həqiqi səhv daha əvvəl ola bilər. İpucu kimi istifadə edin, sonra yoxlayın.

JSON tək dırnaq istifadə edə bilərmi?

Xeyr. Standart JSON sətirləri və üzv adları cüt dırnaq istifadə edir.

JSON-da son vergül ola bilərmi?

Xeyr. Standart JSON son xassədən və ya massiv elementindən sonra vergülə icazə vermir.

Sətrin etibarlı JSON olduğunu necə yoxlayım?

try/catch içində JSON.parse çağırın, və ya mətni JSON formatlayıcı və müqayisə içinə yapışdırın. Ayırma SyntaxError atırsa, sətir etibarlı JSON deyil.