JSON Formatlayıcı ve Doğrulayıcı
JSON verinizi tarayıcınızda biçimlendirin ve doğrulayın. Tekrarlanan anahtarları ve büyük tam sayılarda sessizce oluşan hassasiyet kaybını tespit eder.
Özet (TL;DR)
- JSON.parse büyük tam sayıları sessizce bozar: 9007199254740993 değeri 9007199254740992 olarak okunur ve geri dönüşü yoktur.
- Tekrarlanan anahtarlarda son değer kazanır; çoğu doğrulayıcı bunu "geçerli" diyerek geçiştirir.
- Bu araç her iki durumu da satır numarasıyla bildirir.
- Veriniz tarayıcınızdan çıkmaz; biçimlendirme tamamen yerelde yapılır.
JSON biçimlendirme neden göründüğünden zor
Bir JSON metnini okunabilir hale getirmek ilk bakışta iki satırlık iştir: JSON.parse ile ayrıştır, JSON.stringify ile girintili yaz. Sorun şu ki bu iki adım arasında veri kaybı yaşanabilir ve kayıp hiçbir hata mesajı üretmez. Aracın üst kısmındaki örneği yüklerseniz her iki sorunu da aynı anda görebilirsiniz.
Büyük tam sayılarda hassasiyet kaybı
JavaScript sayıları IEEE-754 çift duyarlıklı kayan noktalı biçimde tutar. Bu biçim tam sayıları yalnızca 2^53 - 1 (yani 9007199254740991) değerine kadar kayıpsız gösterebilir. Daha büyük bir tam sayı ayrıştırıldığında en yakın gösterilebilir değere yuvarlanır:
JSON.parse('{"id":9007199254740993}')// { id: 9007199254740992 } <-- son hane değişti JSON.parse('{"tutar":1e400}')// { tutar: Infinity }JSON.stringify({ tutar: Infinity })// '{"tutar":null}' <-- değer tamamen kaybolduBu senaryo teorik değil. Snowflake tabanlı kimlikler (Twitter, Discord), bazı veritabanlarının BIGINT birincil anahtarları ve finansal sistemlerdeki kuruş cinsinden tutarlar rahatlıkla bu aralığa girer. Bir API yanıtını biçimlendirip kopyaladığınızda, elinizde artık farklı bir kimlik olabilir.
Uyarı
Tekrarlanan anahtarlar
JSON standardı (RFC 8259) nesne içindeki anahtarların benzersiz olmasını tavsiye eder ama zorunlu kılmaz. Ayrıştırıcıların çoğu, aynı anahtar birden fazla geçtiğinde sonuncusunu alır ve öncekileri sessizce atar:
JSON.parse('{"rol":"okuyucu","rol":"yonetici"}')// { rol: 'yonetici' } <-- "okuyucu" yok olduBu davranış, elle birleştirilmiş yapılandırma dosyalarında ve şablonla üretilen JSON çıktılarında gerçek bir güvenlik sorununa dönüşebilir. İki farklı sistem aynı belgeyi farklı sırayla okuyorsa (biri ilk değeri, diğeri son değeri alıyorsa) yetki kararları ayrışır. Araç, tekrarlanan her anahtarı satır numarasıyla listeler.
Sık karşılaşılan ayrıştırma hataları
| Girdi | Neden geçersiz | Düzeltme |
|---|---|---|
| {'ad': 'Ali'} | JSON yalnızca çift tırnak kabul eder | {"ad": "Ali"} |
| {"a": 1,} | Sondaki virgül JSON'da geçersizdir | {"a": 1} |
| {"a": undefined} | undefined bir JSON değeri değildir | {"a": null} |
| {a: 1} | Anahtarlar tırnak içinde olmalıdır | {"a": 1} |
| // yorum satırı | JSON yorum desteklemez | Yorumları kaldırın veya JSONC kullanın |
Dosya başındaki görünmez BOM karakteri de sık rastlanan bir tuzaktır. Windows üzerinde üretilen dosyalar \uFEFF ile başlayabilir ve JSON.parse bunu geçersiz sayar. Bu araç BOM karakterini otomatik olarak temizler.
Türkçe karakterler ve kodlama
JSON metinleri Unicode'dur ve Türkçe karakterler doğrudan yazılabilir. {"sehir":"İstanbul"} tamamen geçerlidir. Bazı sistemlerin bunları \u0130 biçimine kaçırdığını görürsünüz; ikisi de aynı veriyi taşır, yalnızca gösterim farklıdır. Sorun genellikle JSON'da değil, dosyanın UTF-8 dışında bir kodlamayla okunmasında olur.
Sıkça Sorulan Sorular
- Yapıştırdığım veri bir sunucuya gönderiliyor mu?
- Hayır. Biçimlendirme, doğrulama ve tüm kontroller tarayıcınızda çalışan JavaScript ile yapılır. Veri hiçbir ağ isteğine konu olmaz; sayfayı açtıktan sonra internet bağlantınızı kesseniz bile araç çalışmaya devam eder.
- JSON dosyasında yorum satırı kullanabilir miyim?
- Standart JSON yorum desteklemez. Yapılandırma dosyalarında yorum gerekiyorsa JSONC (VS Code ayarlarında kullanılır), JSON5 veya YAML gibi bir üst küme tercih edilir. Bu araç standart JSON bekler.
- Çok büyük bir dosyayı biçimlendirebilir miyim?
- Birkaç megabaytlık dosyalar sorunsuz işlenir. Çok daha büyük girdilerde tarayıcı sekmesi kısa süreliğine yanıt vermeyebilir, çünkü ayrıştırma tek iş parçacığında yapılır. Onlarca megabaytlık dosyalar için jq gibi komut satırı araçları daha uygundur.
- Girinti olarak boşluk mu sekme mi kullanmalıyım?
- Teknik olarak fark etmez; JSON boşlukları anlamsızdır. Ekip standardınız neyse ona uyun. Depoya yazılan dosyalarda tutarlılık, seçimin kendisinden daha önemlidir çünkü karışık girinti gereksiz diff gürültüsü üretir.
- Neden "geçerli" diyen başka araçlar tekrarlanan anahtarı bildirmiyor?
- Çünkü çoğu araç yalnızca JSON.parse çağırıp hata alıp almadığına bakar. Ayrıştırma başarılı olduğunda tekrarlanan anahtarın kanıtı çoktan silinmiştir. Bu aracın kontrolü ham metin üzerinde ayrı bir tarama yaparak çalışır.