Teknik yardım
JSON.parse neden "Unexpected token" diyor?
Metin geçerli JSON olmadığında JSON.parse Unexpected token fırlatır. Tek tırnak, sondaki virgül, HTML yanıtları ve hata konumunu ayıklayın.
Girdi geçerli JSON olmadığında JSON.parse() bir SyntaxError fırlatır. «Unexpected token» genelde ayrıştırıcının yapının o noktasında izin verilmeyen bir karaktere ulaştığı anlamına gelir.
Yaygın nedenler tek tırnak, sondaki virgül, tırnaksız özellik adları, hatalı dizge kaçışı, JSON’un çevresindeki fazla metin veya HTML ya da başka bir JSON olmayan gövdeyi JSON gibi ayrıştırmaktır.
Hatanın tam ifadesi JavaScript motoruna ve tarayıcıya göre değişir. Her çalışma ortamının «Unexpected token X in JSON at position N» yazdıracağını varsaymayın.
Bu, JSON.parse Unexpected token ayıklamasıdır: hata ne demek, konum nasıl okunur, gövde HTML olduğunda ne yapılır. Sondaki virgül, tırnak ve Unexpected end daha geniş Yaygın JSON Hataları: Sondaki Virgül, Tırnak ve Unexpected Token içinde.
JSON.parse() içinde “Unexpected token” ne demek?
JSON.parse() JSON grameri ister. Geçerli konumdaki yasadışı karakter SyntaxError fırlatır. {“name”:“Alex”,} geçersizdir: o virgülden sonra nesne bitemez. İleti metni ve konum çalışma ortamına göre hâlâ değişir.
JSON.parse() hangi hatayı fırlatır?
Geçersiz JSON genelde SyntaxError fırlatır. Türü doğrulamak için error.name’i günlüğe yazın. Tam error.message’i sabitlemeyin: motorlar ve sürümler farklı yazar.
try {
JSON.parse('{"name":"Alex",}');
} catch (error) {
console.log(error.name);
// SyntaxError
}
1. Çift tırnak yerine tek tırnak kullanmak
{‘name’:‘Alex’} geçersiz JSON’dur. {“name”:“Alex”} geçerlidir. JSON dizgeleri ve nesne üye adları çift tırnak kullanır. const user = { name: ‘Alex’ } gibi bir JavaScript nesne yazımı yasal JavaScript olabilir ve yine de JSON metni olmayabilir.
Geçersiz
{'name':'Alex'}
Geçerli
{"name":"Alex"}
2. Sondaki virgüller
Son özellikten veya dizi öğesinden sonraki virgül geçerli standart JSON değildir. {“name”:“Alex”,“age”:30,} ve [1, 2, 3,] ikisi de başarısız olur. Bunu bir Unexpected token nedeni sayın; Yaygın JSON Hataları: Sondaki Virgül, Tırnak ve Unexpected Token sondaki virgülleri daha derin işler.
Geçersiz
{
"name": "Alex",
"age": 30,
}
Geçerli
{
"name": "Alex",
"age": 30
}
[1, 2, 3,]
3. Tırnaksız özellik adları
{ name: “Alex” } bir JavaScript nesne yazımı olabilir. JSON’da üye adları dizgedir ve çift tırnak ister: {“name”:“Alex”}.
Geçersiz
{
name: "Alex"
}
Geçerli
{
"name": "Alex"
}
4. Geçersiz dizge kaçışı
JSON metninde ters eğik çizgi bir kaçış başlatır. C:\Users\Alex gibi ham bir yol geçersizdir çünkü \U yasal bir kaçış değildir. Ters eğik çizgileri ikiye katlayın. Ev sahibi dil dizge kaçışını JSON kaçışıyla karıştırmayın. Yaygın JSON Hataları: Sondaki Virgül, Tırnak ve Unexpected Token bunu daha derin işler.
Geçersiz
{"file":"C:\Users\Alex"}
Geçerli
{"file":"C:\\Users\\Alex"}
5. JSON’dan önce veya sonra fazla metin
JSON.parse tek bir JSON değeri bekler. {“ok”:true} önündeki Success: gibi bir önek veya ardındaki done gibi bir sonek tüm dizgeyi geçersiz kılar. Tek bir JSON değeri çevresindeki önemsiz boşluk izinlidir. JSON’un değerden önce veya sonra boşluk içermesi yasak değildir.
Success:
{"ok":true}
{"ok":true}
done
6. JSON yerine HTML ayrıştırmak
Bir HTML sayfasında response.json() çağırmak yaygın bir Unexpected token durumudur. Yanlış endpoint’ler, 404 veya 500 HTML sayfaları, giriş yönlendirmeleri, vekil gövdeleri ve yedek sayfalar çoğu zaman işaretlemeyle başlar. «Unexpected token < her zaman HTML demektir» fazla keskindir: < ipucudur, kanıt değil.
fetch('/api/data')
.then(response => response.json())
“Unexpected token <” genelde ne demek?
JSON değerleri genelde < ile başlamaz. Gövde veya ile başlıyorsa < ilk yasadışı karakter olabilir. Yerel ayıklamada HTTP durumunu, Content-Type’ı ve ham gövdeyi kontrol edin. Motor ifadesi hâlâ değişir.
Ayrıştırmadan önce yanıtı kontrol edin
fetch gövdesi yalnızca bir kez tüketilebilir. Yerel ayıklamada önce text() okuyun, kısa bir öneke bakın, sonra aynı dizgeye JSON.parse uygulayın. Aynı yanıtta response.json() sonra response.text() çağırmayın. Hassas üretim yüklerini varsayılan olarak günlüğe yazmayın.
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” ne demek?
Bazı motorlar konum, satır veya sütun bildirir. Yakınında kötü tırnak, virgül, küme ayracısı veya kaçış arayın. O dizin, ayrıştırmanın sorun fark ettiği yerdir; gerçek neden daha önce olabilir. Tam kusurlu karakter olduğu garanti değildir.
Unexpected token ile Unexpected end
Unexpected token, ayrıştırıcının beklemediği bir karakterle karşılaşmasıdır. Unexpected end, girdi değer tamamlanmadan durduğunda görünebilir; örneğin kapanış küme ayracısız {“name”:“Alex”. Tam ifade motora bağlıdır. Yaygın JSON Hataları: Sondaki Virgül, Tırnak ve Unexpected Token eksik JSON’u daha geniş işler.
{"name":"Alex"
JSON bir JavaScript nesne yazımı değildir
JSON bir veri biçimidir. JavaScript nesne yazımı JavaScript sözdizimidir. Tırnaksız anahtarlar, tek tırnak ve sondaki virgül içeren JS nesnesi geçerli JSON metni değildir. JSON.parse JavaScript nesne yazımlarını güvenle ayrıştıramaz.
const data = {
name: 'Alex',
active: true,
};
{
"name": "Alex",
"active": true
}
JSON yorum içerebilir mi?
Standart JSON yorumları desteklemez. Nesne içindeki bir // satırı geçersizdir. JSON5 ve benzeri uzantılar farklı biçimlerdir. JSON biçimlendir ve karşılaştır standart JSON’u JSON.parse ile doğrular ve JSON5’i JSON saymaz.
{
// user name
"name": "Alex"
}
undefined, NaN ve Infinity geçerli JSON mu?
Hayır. JSON değerleri nesne, dizi, dizge, sayı, true, false ve null’dır. undefined, NaN ve Infinity değildir. Üst düzey bir değer nesne veya dizi olmak zorunda değildir: true, 123, “hello” ve null geçerli JSON’dur.
{"a":undefined}
{"a":NaN}
{"a":Infinity}
true
123
"hello"
null
Unexpected token hatası adım adım nasıl düzeltilir
Hata dizgesinde değil, kaynakta çalışın:
- Girdinin gerçekten JSON olduğunu doğrulayın; HTML, günlük veya JavaScript olmadığını.
- Ham girdinin ilk karakterlerine bakın.
- Bir API’den geldiyse HTTP durumunu ve Content-Type’ı kontrol edin. Ne 200 ne application/json geçerli JSON garantiler.
- Sözdizimini bir JSON ayrıştırıcıda doğrulayın.
- Bildirilen konum, satır veya sütunu ipucu olarak kullanın; garantili kök neden olarak değil.
- O bölgenin yakınında tırnak, virgül, küme ayracı, köşeli ayraç ve kaçışları kontrol edin.
- Biçimlenmiş, doğrulanmış bir kopyayla karşılaştırın.
- Serileştiriciyi veya endpoint’i düzeltin. Bildirilen simgeyi rastgele silmeyin.
' karakterinin " ile küresel değiştirilmesi dizge içindeki kesme işaretlerini, zaten kaçırılmış metni ve JSON olmayan kaynakları bozabilir. Geçerli JSON’u gerçek serileştiriciden üretin. eval’i JSON ayrıştırıcı saymayın.
JavaScript’te JSON üretirken JSON.stringify() kullanın
Elle dizge birleştirmek yerine JSON.stringify tercih edin. Serilediği değerler için geçerli JSON metni üretir. Her JavaScript değerini korumaz: undefined, işlevler ve simgeler özel davranışa sahiptir. O ayrıntı burada kapsam dışıdır.
const data = {
name: "Alex",
active: true
};
const json = JSON.stringify(data);
// {"name":"Alex","active":true}
Geçersiz JSON ile gerçek düzeltme
Bu çiftler JSON.parse ile denendi. HTML için düzeltme yanıttır, sözdizimi düzenlemesi değil.
| Sorun | Geçersiz | Düzeltme |
|---|---|---|
| Tek tırnak | {'a':1} |
{"a":1} |
| Sondaki virgül | {"a":1,} |
{"a":1} |
| Tırnaksız anahtar | {a:1} |
{"a":1} |
| undefined | {"a":undefined} |
{"a":null} |
| HTML gövdesi | <html>... |
Endpoint’i ve ham yanıtı kontrol edin. HTML’i düzenleyerek JSON yapmayın. |
Unexpected token için basit karar kılavuzu
JSON.parse başarısız olduysa tırnakları yeniden yazmadan önce JSON’unuz olup olmadığına karar verin.
- JSON.parse başarısız oldu
- API’den mi? Durumu, Content-Type’ı ve ham gövdeyi kontrol edin
- JSON ile mi başlıyor? Değilse kaynağı veya endpoint’i düzeltin
- Evetse tırnak, virgül, ayraç, kaçış, desteklenmeyen değerleri doğrulayın
- Bildirilen konumu ipucu olarak kullanın
- Kaynağı düzeltin, sonra yeniden ayrıştırın
Ayrıştırmadan veya kullanmadan önce JSON’u doğrulayın
NEXNARA JSON biçimlendir ve karşılaştır tarayıcıda JSON’u JSON.parse ile doğrular—eval ile değil.
Doğrulayın, 2 boşluk, 4 boşluk veya sekmeyle güzelleştirin, küçültün, kopyalayın, indirin ve .json yükleyin. JSON Diff iç içe nesne ve dizileri, yolları, özeti, süzgeçleri ve takası kapsar. Ayrıştırmadan sonra aynı verinin güzel ve küçültülmüş kopyaları eşit karşılaştırılır; nesne anahtarları ada göre karşılaştırılır.
5 MB’den büyük metin yavaş gelebilir. 15 MB’den büyük metin tarayıcıda işlenmez.
JSON doğrulama ve biçimlendirme tarayıcınızda olur. Bu araç JSON’u bir NEXNARA sunucusuna göndermez. Reklamlar ve diğer site özellikleri yine ağı kullanır.
Başarısız dizgeyi JSON biçimlendir ve karşılaştır içine yapıştırın ve tırnakları yeniden yazmadan önce ilk karakterleri okuyun.
FAQ
JSON.parse neden Unexpected token diyor?
Metin, ayrıştırıcının durduğu noktada geçerli JSON değildir. Tipik nedenler tırnak, virgül, fazla metin veya HTML gibi JSON olmayan bir gövdedir.
Unexpected token < in JSON ne demek?
İlk yasadışı karakter < olabilir. Bu çoğu zaman bir HTML sayfasına işaret eder ama her durumda 404 veya HTML kanıtı değildir. Durumu, Content-Type’ı ve ham gövdeyi kontrol edin.
JSON’da hata konumunu nasıl bulurum?
Motor konum, satır veya sütun bildirirse yakınına bakın. Asıl hata daha önce olabilir. Bunu ipucu sayın, sonra doğrulayın.
JSON tek tırnak kullanabilir mi?
Hayır. Standart JSON dizgeleri ve üye adları çift tırnak kullanır.
JSON sondaki virgül içerebilir mi?
Hayır. Standart JSON son özellikten veya dizi öğesinden sonra virgüle izin vermez.
Bir dizgenin geçerli JSON olup olmadığını nasıl kontrol ederim?
try/catch içinde JSON.parse çağırın veya metni JSON biçimlendir ve karşılaştır içine yapıştırın. Ayrıştırma SyntaxError fırlatırsa dizge geçerli JSON değildir.