Tech Help
Mengapa JSON.parse Berkata "Unexpected token"?
JSON.parse melempar Unexpected token apabila teks bukan JSON yang sah. Jejaki petik tunggal, koma trailing, respons HTML, dan kedudukan ralat.
JSON.parse() melempar SyntaxError apabila input bukan JSON yang sah. “Unexpected token” umumnya bermaksud penghurai sampai kepada aksara yang tidak dibenarkan pada titik itu dalam struktur.
Punca lazim termasuk petik tunggal, koma trailing, nama sifat tanpa petik, escape rentetan yang salah, teks tambahan di sekeliling JSON, atau menghurai HTML atau badan bukan JSON lain sebagai JSON.
Lafaz ralat yang tepat berbeza mengikut enjin JavaScript dan pelayar. Jangan anggap setiap runtime mencetak “Unexpected token X in JSON at position N”.
Ini ialah penjejakan Unexpected token bagi JSON.parse: maksud ralat, cara membaca position, dan apa yang perlu dibuat apabila badan ialah HTML. Liputan koma trailing, petik, dan Unexpected end yang lebih luas ada di Ralat JSON Lazim: Koma Trailing, Tanda Petik, dan Unexpected Token.
Apa Maksud “Unexpected token” dalam JSON.parse()?
JSON.parse() menuntut tatabahasa JSON. Aksara haram pada kedudukan semasa melempar SyntaxError. {“name”:“Alex”,} tidak sah: selepas koma itu objek tidak boleh tamat. Teks mesej dan position masih berbeza mengikut runtime.
Ralat Apa yang Dilempar JSON.parse()?
JSON tidak sah umumnya melempar SyntaxError. Log error.name untuk mengesahkan jenis. Jangan hardkod error.message penuh: enjin dan versi merumuskannya berbeza.
try {
JSON.parse('{"name":"Alex",}');
} catch (error) {
console.log(error.name);
// SyntaxError
}
1. Menggunakan Petik Tunggal, Bukan Petik Berganda
{‘name’:‘Alex’} bukan JSON yang sah. {“name”:“Alex”} adalah sah. Rentetan JSON dan nama ahli objek menggunakan petik berganda. Literal objek JavaScript seperti const user = { name: ‘Alex’ } boleh sah sebagai JavaScript dan tetap bukan teks JSON.
Tidak sah
{'name':'Alex'}
Sah
{"name":"Alex"}
2. Koma Trailing
Koma selepas sifat atau item tatasusunan terakhir tidak sah dalam JSON piawai. {“name”:“Alex”,“age”:30,} dan [1, 2, 3,] kedua-duanya gagal. Anggap ini sebagai satu punca Unexpected token; Ralat JSON Lazim: Koma Trailing, Tanda Petik, dan Unexpected Token merangkumi koma trailing dengan lebih mendalam.
Tidak sah
{
"name": "Alex",
"age": 30,
}
Sah
{
"name": "Alex",
"age": 30
}
[1, 2, 3,]
3. Nama Sifat Tanpa Petik
{ name: “Alex” } boleh menjadi literal objek JavaScript. Dalam JSON, nama ahli objek ialah rentetan dan memerlukan petik berganda: {“name”:“Alex”}.
Tidak sah
{
name: "Alex"
}
Sah
{
"name": "Alex"
}
4. Escape Rentetan Tidak Sah
Dalam teks JSON, condong belakang memulakan escape. Laluan mentah seperti C:\Users\Alex tidak sah kerana \U bukan escape yang sah. Gandakan condong belakang. Jangan campur escape rentetan bahasa hos dengan escape JSON. Ralat JSON Lazim: Koma Trailing, Tanda Petik, dan Unexpected Token merangkumi ini dengan lebih mendalam.
Tidak sah
{"file":"C:\Users\Alex"}
Sah
{"file":"C:\\Users\\Alex"}
5. Teks Tambahan Sebelum atau Selepas JSON
JSON.parse menjangka satu nilai JSON. Awalan seperti Success: sebelum {“ok”:true}, atau akhiran seperti done selepasnya, menjadikan seluruh rentetan tidak sah. Ruang putih tidak bermakna di sekeliling satu nilai JSON dibenarkan. JSON tidak dilarang mempunyai ruang sebelum atau selepas nilai.
Success:
{"ok":true}
{"ok":true}
done
6. Menghurai HTML, Bukan JSON
Memanggil response.json() pada halaman HTML ialah kes Unexpected token yang lazim. Titik hujung salah, halaman HTML 404 atau 500, lencongan log masuk, badan proksi, dan halaman sandaran sering bermula dengan penanda. “Unexpected token < sentiasa bermaksud HTML” terlalu kuat: < ialah petunjuk, bukan bukti.
fetch('/api/data')
.then(response => response.json())
Apa Maksud “Unexpected token <” Lazimnya?
Nilai JSON biasanya tidak bermula dengan <. Jika badan bermula dengan atau , < mungkin aksara haram pertama. Semasa menjejak secara setempat, periksa status HTTP, Content-Type, dan badan mentah. Lafaz enjin masih berbeza.
Periksa Respons Sebelum Menghurainya
Badan fetch hanya boleh digunakan sekali. Semasa menjejak secara setempat, baca text() dahulu, periksa awalan singkat, kemudian JSON.parse rentetan yang sama. Jangan panggil response.json() kemudian response.text() pada respons yang sama. Jangan log muatan pengeluaran yang sensitif secara lalai.
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);
}
Apa Maksud “at Position 123”?
Sesetengah enjin melaporkan position, baris, atau lajur. Cari berhampiran petik, koma, kurungan, atau escape yang rosak. Indeks itu ialah tempat penghurai menyedari masalah; punca sebenar boleh lebih awal. Ia tidak dijamin aksara yang rosak tepat.
Unexpected token berbanding Unexpected end
Unexpected token bermaksud penghurai menemui aksara yang tidak dijangka. Unexpected end boleh muncul apabila input berhenti sebelum nilai lengkap, seperti {“name”:“Alex” tanpa kurungan tutup. Lafaz tepat bergantung pada enjin. Ralat JSON Lazim: Koma Trailing, Tanda Petik, dan Unexpected Token merangkumi JSON tidak lengkap dengan lebih luas.
{"name":"Alex"
JSON Bukan Literal Objek JavaScript
JSON ialah format data. Literal objek JavaScript ialah sintaks JavaScript. Objek JS dengan kunci tanpa petik, petik tunggal, dan koma trailing bukan teks JSON yang sah. JSON.parse tidak dapat menghurai literal objek JavaScript dengan selamat.
const data = {
name: 'Alex',
active: true,
};
{
"name": "Alex",
"active": true
}
Bolehkah JSON Mengandungi Ulasan?
JSON piawai tidak menyokong ulasan. Baris // dalam objek tidak sah. JSON5 dan lanjutan serupa ialah format berbeza. Format dan bandingkan JSON mengesahkan JSON piawai dengan JSON.parse dan tidak merawat JSON5 sebagai JSON.
{
// user name
"name": "Alex"
}
Adakah undefined, NaN, dan Infinity JSON yang Sah?
Tidak. Nilai JSON ialah object, array, string, number, true, false, dan null. undefined, NaN, dan Infinity bukan. Nilai peringkat atas tidak perlu objek atau tatasusunan: true, 123, “hello”, dan null adalah JSON yang sah.
{"a":undefined}
{"a":NaN}
{"a":Infinity}
true
123
"hello"
null
Cara Membetulkan Ralat Unexpected token Langkah demi Langkah
Kerja sumber, bukan rentetan ralat:
- Sahkan input memang JSON, bukan HTML, log, atau JavaScript.
- Periksa aksara pertama input mentah.
- Jika datang daripada API, periksa status HTTP dan Content-Type. Kedua-dua 200 dan application/json tidak menjamin JSON yang sah.
- Sahkan sintaks dalam penghurai JSON.
- Guna position, baris, atau lajur yang dilaporkan sebagai petunjuk, bukan sebagai punca akar yang dijamin.
- Periksa petik, koma, kurungan kurus, kurungan siku, dan escape berhampiran kawasan itu.
- Bandingkan dengan salinan yang sudah diformat dan disahkan.
- Baiki pensiri atau titik hujung. Jangan padam token yang dilaporkan secara rawak.
Penggantian global ' dengan " boleh merosakkan apostrof dalam rentetan, teks yang sudah di-escape, dan sumber bukan JSON. Hasilkan JSON yang sah daripada pensiri sebenar. Jangan anggap eval sebagai penghurai JSON.
Guna JSON.stringify() Apabila Menghasilkan JSON dalam JavaScript
Utamakan JSON.stringify berbanding menyambung rentetan secara manual. Ia mengeluarkan teks JSON yang sah untuk nilai yang disiri. Ia tidak mengekalkan setiap nilai JavaScript: undefined, fungsi, dan simbol mempunyai tingkah laku khas. Butiran itu di luar skop di sini.
const data = {
name: "Alex",
active: true
};
const json = JSON.stringify(data);
// {"name":"Alex","active":true}
JSON Tidak Sah berbanding Baiki Sebenar
Pasangan ini disemak dengan JSON.parse. Untuk HTML, baiki ialah respons, bukan suntingan sintaks.
| Masalah | Tidak sah | Baiki |
|---|---|---|
| Petik tunggal | {'a':1} |
{"a":1} |
| Koma trailing | {"a":1,} |
{"a":1} |
| Kunci tanpa petik | {a:1} |
{"a":1} |
| undefined | {"a":undefined} |
{"a":null} |
| Badan HTML | <html>... |
Periksa titik hujung dan respons mentah. Jangan sunting HTML menjadi JSON. |
Panduan Keputusan Unexpected token yang Ringkas
Jika JSON.parse gagal, putuskan sama ada anda mempunyai JSON sebelum menulis semula petik.
- JSON.parse gagal
- Daripada API? Periksa status, Content-Type, dan badan mentah
- Adakah ia bermula dengan JSON? Jika tidak, baiki sumber atau titik hujung
- Jika ya, sahkan petik, koma, kurungan kurus, kurungan siku, escape, nilai tidak disokong
- Guna position yang dilaporkan sebagai petunjuk
- Baiki sumber, kemudian hurai semula
Sahkan JSON Sebelum Menghurai atau Menggunakannya
NEXNARA Format dan bandingkan JSON mengesahkan JSON dalam pelayar dengan JSON.parse—bukan eval.
Sahkan, rapikan dengan 2 ruang, 4 ruang, atau tab, minify, salin, muat turun, dan muat naik .json. JSON Diff merangkumi objek dan tatasusunan bersarang, laluan, ringkasan, penapis, dan tukar. Selepas dihurai, salinan rapi dan minify data yang sama dibandingkan sama; kunci objek dibandingkan mengikut nama.
Teks lebih besar daripada 5 MB mungkin terasa perlahan. Teks lebih besar daripada 15 MB tidak diproses dalam pelayar.
Pengesahan dan pemformatan JSON berlaku dalam pelayar anda. Alat ini tidak menghantar JSON ke pelayan NEXNARA. Iklan dan ciri tapak lain masih menggunakan rangkaian.
Tampal rentetan yang gagal ke Format dan bandingkan JSON dan baca aksara pertama sebelum menulis semula petik.
FAQ
Mengapa JSON.parse berkata Unexpected token?
Teks bukan JSON yang sah pada titik penghurai berhenti. Punca lazim ialah petik, koma, teks tambahan, atau badan bukan JSON seperti HTML.
Apa maksud Unexpected token < dalam JSON?
Aksara haram pertama mungkin <. Itu sering menunjuk ke halaman HTML, tetapi bukan bukti 404 atau HTML dalam setiap kes. Periksa status, Content-Type, dan badan mentah.
Bagaimana saya mencari kedudukan ralat dalam JSON?
Jika enjin melaporkan position, baris, atau lajur, lihat berhampiran. Kesilapan sebenar boleh lebih awal. Guna sebagai petunjuk, kemudian sahkan.
Bolehkah JSON menggunakan petik tunggal?
Tidak. Rentetan dan nama ahli JSON piawai menggunakan petik berganda.
Bolehkah JSON mempunyai koma trailing?
Tidak. JSON piawai tidak membenarkan koma selepas sifat atau item tatasusunan terakhir.
Bagaimana saya semak sama ada rentetan ialah JSON yang sah?
Panggil JSON.parse dalam try/catch, atau tampal teks ke Format dan bandingkan JSON. Jika penghurai melempar SyntaxError, rentetan itu bukan JSON yang sah.