Yaygın JSON hataları ve nasıl düzeltilir
Vahşi doğada gerçekten karşılaşacağınız JSON hatalarına bir saha rehberi - ne anlama geldikleri, nereden geldikleri ve hızlıca nasıl düzeltilecekleri.
JSON ile çalışan her geliştirici bir noktada hata mesajlarını ezbere öğrenir. “Unexpected token in JSON at position 47” — sabahın 3’ünde bir sürüm göndermeye çalışırken bu mesaja bakıp kalmamış biri var mı? Mesajlar teknik olarak doğru ama çoğunlukla işe yaramıyor: belirtilen konum nadiren hatanın asıl yaşadığı yerdir.
Aşağıda pratikte gerçekten karşılaşacağınız JSON hataları, ne anlama geldikleri ve her birini hızla nasıl düzelteceğiniz var. Tüm örnekler standart JSON.parse() uygulamasına karşı test edildi.
1. “Unexpected token , in JSON”
Ne anlama gelir: sondaki virgül.
{
"name": "Alice",
"role": "admin",
}
"admin"’den sonraki virgül geçersiz. JSON, JavaScript nesne literallerinin veya Python sözlüklerinin aksine sondaki virgüle izin vermez.
Düzeltme: sondaki virgülü kaldırın.
Kaynak: JSON’u elle düzenleyenler veya JavaScript tarzı nesne literallerini “JSON” diye dışa aktaran araçlar.
Tuzak: çözümleyici genellikle virgülün sonraki satırına işaret eder, virgülün kendisine değil. Hata “satır 5” diyorsa önce satır 4’e bakın.
2. “Unexpected end of JSON input”
Ne anlama gelir: dosya kesilmiş. Kapanış parantezi eksik.
{
"users": [
{ "name": "Alice" },
{ "name": "Bob" }
]
← dış nesne için eksik kapanış küme parantezi
Düzeltme: parantezlerinizi sayın. Çoğu editör parantez eşleşmesi gösterir — imlecinizi açılış { üzerine koyun, neyle eşleştiğini görün.
Kaynak: tamamlanmadan düşen HTTP indirmeleri, yarıda kalan yazma işlemleri, dosya bozulması.
Tanı: dosya boyutunu kontrol edin. 200 KB beklediyseniz 180 KB geldiyse, dosya kesilmiştir.
3. “Unexpected token } in JSON”
Ne anlama gelir: fazladan kapanış parantezi ya da iki eleman arasında eksik virgül.
{
"name": "Alice" ← burada eksik virgül
"role": "admin"
}
Düzeltme: eksik virgülü ekleyin.
Veya:
{ "name": "Alice" } } ← fazladan kapanış parantezi
Düzeltme: fazladan parantezi kaldırın.
4. “Unexpected token u in JSON”
Ne anlama gelir: bir değer beklenen yerde undefined göründü. undefined geçerli bir JSON değeri değil.
{ "role": undefined }
JSON’un undefined diye bir kavramı yok — yalnızca null var.
Düzeltme: undefined’ı null ile değiştirin veya anahtarı tamamen kaldırın.
5. “Unexpected token < in JSON”
Ne anlama gelir: “JSON“‘unuz aslında HTML. < bir HTML etiketinin başlangıcı.
<!DOCTYPE html>
<html>
<head><title>500 Server Error</title>
...
Düzeltme: sunucunuzun gerçekte ne döndürdüğünü kontrol edin. Büyük ihtimalle beklediğiniz JSON yanıtı yerine bir hata sayfası geliyor.
Tanı: çözümlemeden önce console.log(response.text) çalıştırın. HTML görürseniz sorun JSON tarafında değil, sunucu tarafında.
6. “Unexpected token ’ in JSON”
Ne anlama gelir: çift tırnak yerine tek tırnak.
{ 'name': 'Alice' }
JSON dizeleri çift tırnaklı olmak zorunda. JavaScript’te ve Python’da çalışsalar da, tek tırnaklı dizeler geçersiz JSON.
Düzeltme: tüm tek tırnakları çift tırnaklarla değiştirin. Dizeler içinde gerçek çift tırnak varsa kaçırın (\").
Kaynak: JavaScript nesne literallerini yapıştırıp “bu JSON” demek; json.dumps() yerine Python print() çıktısı kullanmak.
7. “Unexpected token n in JSON”
Ne anlama gelir: çoğunlukla dize içinde gerçek satır sonu.
{ "description": "hello
world" }
JSON dizeleri gerçek satır sonu karakteri içeremez. \n olarak kaçırılmalı.
Düzeltme:
{ "description": "hello\nworld" }
Kaynak: çok satırlı girdiden JSON’u manuel oluşturma veya metin alanlarını kaçırmadan döken sistemler.
8. “Unexpected number in JSON”
Ne anlama gelir: geçersiz formatta sayı.
Yaygın geçersiz sayılar:
+5(baştaki artı — izin yok)07(baştaki sıfır — izin yok)1.(sonrası olmayan ondalık nokta).5(sıfırsız baştaki nokta)Infinity,-Infinity,NaN— JSON’da yok
Düzeltme: baştaki +’ı kaldırın, baştaki sıfırları çıkarın, eksik sıfırları ekleyin (1. → 1.0, .5 → 0.5), Infinity/NaN’ı null veya string ile değiştirin.
9. “Duplicate key ’…’ in JSON”
Ne anlama gelir: aynı anahtar iki kez var.
{
"name": "Alice",
"name": "Bob"
}
Standart çözümleyiciler bunu kabul eder ama sessizce son değeri alır. Katı çözümleyiciler reddeder. Çözümleyiciniz sizi uyarıyorsa iyilik yapıyor.
Düzeltme: hangisinin doğru olduğuna karar verip diğerini kaldırın. Her zaman.
10. “Expected ’:’ after property name in JSON”
Ne anlama gelir: : yerine = kullandınız ya da iki nokta üst üsteyi unuttunuz.
{ "name" = "Alice" } ← yanlış
{ "name" "Alice" } ← yanlış
Düzeltme: iki nokta üst üste kullanın.
Kaynak: YAML veya TOML’dan gelen kas hafızası.
11. Geçersiz UTF-8 veya BOM
Ne anlama gelir: dosya bir BOM (byte-order mark) ile başlıyor ya da geçersiz UTF-8 baytları içeriyor.
BOM (U+FEFF) eski bir Windows dosya kodlama işaretleyicisi. Çoğu JSON çözümleyici bunu tolere eder ama bazıları reddeder.
Düzeltme: BOM’u çıkarın. macOS/Linux’ta: tail -c +4 file.json > file-clean.json. Windows’ta: editörde “UTF-8 without BOM” olarak kaydedin.
Kaynak: Windows Notepad, Microsoft ürünleri, eski CMS dışa aktarmaları.
12. JSON.stringify’dan “Circular structure” hatası
Bu teknik olarak bir çözümleme hatası değil ama yeterince sık çıkıyor.
const obj = { a: 1 }
obj.self = obj
JSON.stringify(obj) // TypeError: Converting circular structure to JSON
Düzeltme: stringify’a kendini referans eden bir yapı geçirmeyin. Serileştirmeden önce veriyi düzleştirin veya flatted ya da safe-stringify gibi bir kütüphane kullanın.
Kaynak: React bileşenleri, DOM düğümleri, geri referanslı ORM modelleri.
Hata ayıklama iş akışı
JSON çözümleme hatasına çarptığınızda:
- Bozuk JSON’u bir biçimlendiriciye kopyalayın
- Format’a tıklayın — reddederse nerede olduğunu söyler
- Raporlanan satırın 2-3 satır öncesine bakın — gerçek hata genellikle daha erken
- Klasik suçluları arayın: sondaki virgül, eksik virgül, tek tırnak, kapanmamış dize
- Çok büyükse ikili arama: belgenin ikinci yarısını silin, tekrar deneyin. Geçerliyse hata orada değil, diğer yarıda. Daraltın.
- Kaynağı kontrol edin — API gerçekten JSON mu döndürdü, yoksa HTML mi?
Önleme alışkanlıkları
- JSON’u commit etmeden önce doğrulayın.
jq empty file.jsonçalıştıran bir pre-commit hook çoğu sorunu yakalar. - JSON anlayan bir linter kullanın — ESLint, Prettier kayıtları anında işaretler.
- Dizeler manuel oluşturmak yerine serileştirme kütüphanelerini (
JSON.stringify,json.dumps) kullanın. - Önemli belgeler için JSON şeması tanımlayın — sözdizimi değil yapı sorunlarını da yakalar.
- Aynı alan için kayıtlar arasında
"1"(string) ve1(sayı) arasında geçiş yapmayın. Değerleri tutarlı yazın.
Biçimlendiriciyi deneyin
Bu listedeki hataların çoğu JSON Formatter ile saniyeler içinde bulunabilir. Bozuk JSON’u yapıştırın, Format’a tıklayın, hata mesajını okuyun. Her şey tarayıcınızda çalışıyor — hassas yapılandırmayı veya API yanıtlarını cihazınızdan çıkarmadan hata ayıklayabilirsiniz.
JSON tasarımı gereği basit — hatalar da basit. Ama baskı altında can sıkıcı oluyorlar. Bir biçimlendiricide iki dakika genellikle sorunu yakalamaya yetiyor.