JSON'un kuralları: RFC 8259 ne diyor?
JSON (JavaScript Object Notation), IETF'in RFC 8259 belgesiyle tanımlanan metin tabanlı bir veri biçimidir. Altı değer türü vardır: nesne (süslü parantez içinde anahtar-değer çiftleri), dizi (köşeli parantez içinde sıralı değerler), metin, sayı, true/false ve null. Adı JavaScript'ten gelse de Python, Java, Go ve PHP gibi dillerin standart kütüphaneleriyle okunur; web servisleri, yapılandırma dosyaları ve dışa aktarımlar büyük ölçüde bu biçimi kullanır.
Standart birkaç konuda katıdır ve hataların çoğu buradan çıkar. Anahtarlar ve metinler çift tırnak içinde olmalıdır; tek tırnak geçersizdir. Söz diziminde yorum satırına ve son öğeden sonra gelen virgüle yer yoktur. Sayılarda baştaki sıfıra izin verilmez: 007 geçersiz, 7 geçerlidir. NaN ve Infinity de JSON sayısı sayılmaz. Metin içindeki çift tırnak, ters eğik çizgi ve U+0000 ile U+001F arasındaki kontrol karakterleri kaçışlanmalıdır; metne doğrudan yapıştırılmış bir sekme karakterinin hata vermesinin nedeni budur.
RFC 8259, kapalı bir sistemin dışında paylaşılan JSON'un UTF-8 ile kodlanmasını zorunlu tutar ve ağ üzerinden gönderilen JSON'un başına bayt sırası işareti (BOM) eklenmemesini ister. Aynı nesnede bir anahtarın iki kez geçmesi ise yasak değildir; standart anahtarların benzersiz olması gerektiğini 'SHOULD' düzeyinde önerir ve aksi durumda uygulamaların farklı davranabileceğini açıkça yazar.
Sık görülen hatalar ve gerçek nedenleri
Tarayıcıların JSON ayrıştırıcısı hata mesajında genellikle bir konum verir, örneğin 'line 1 column 8'. Bu konum hatanın başladığı yeri değil, ayrıştırıcının beklemediği karakteri bulduğu yeri gösterir. Eksik virgülde işaret edilen yer bir sonraki anahtarın tırnağıdır; son öğeden sonra unutulan virgülde ise kapanış parantezi.
Pratikte beş neden öne çıkar. Birincisi, bir JavaScript nesnesinin JSON sanılmasıdır: tırnaksız anahtarlar ya da tek tırnaklı metinler. İkincisi, yorum içeren yapılandırma dosyalarıdır; bazı editör ayar dosyaları 'JSON with Comments' adlı esnek bir türevdir ve standart ayrıştırıcıdan geçmez. Üçüncüsü, her satırında ayrı bir JSON nesnesi bulunan JSON Lines (.jsonl) dosyalarıdır; dosyanın bütünü tek bir JSON belgesi olmadığından bütün hâlinde ayrıştırılınca hata verir. Dördüncüsü, log ekranından kopyalanırken kırpılmış yanıtlardır. Beşincisi ise bazı Windows editörlerinin kullandığı UTF-16 kodlamasıdır.
Bir de sessiz sorun var: yinelenen anahtar. Tarayıcıdaki JSON.parse aynı anahtarı iki kez gördüğünde hata vermez, son değeri alır. Yani {"durum": "aktif", "durum": "pasif"} biçimindeki bir veri görüntüleyicide tek bir durum: pasif alanı olarak görünür. İki sistem aynı dosyadan farklı değer okuyorsa ilk bakılacak yerlerden biri budur.
JSON görüntüleyiciyle adım adım okuma
Dosyayı sayfaya sürükleyin. Geçerli bir JSON ise içerik, ilk iki seviyesi açık bir ağaç görünümünde gelir; kapalı düğümlerin yanında kaç alan ya da öğe içerdikleri yazar. Metinler, sayılar, true/false ve null farklı renklerle gösterilir. Böylece tırnak içindeki "42" ile sayı olan 42 arasındaki farkı bir bakışta ayırt edersiniz; API entegrasyonlarında bu tür uyuşmazlığı sık görürüz.
Ağaçta bir düğümün yanındaki üçgene tıklamak o dalı açar veya kapatır. Derin yapılarda önce üst seviyedeki alan ve öğe sayılarına bakmak, örneğin bir items dizisinin kaç kayıt içerdiğini görmek, veriyi tek tek açmaktan daha hızlı bir genel resim verir.
Düzenli metin sekmesi 2 boşluk girintili, satır numaralı çıktıyı verir. 'Düzenli hâlini kopyala' tek satıra sıkıştırılmış (minified) bir yanıtı okunur biçimde panoya alır; İndir aynı biçimlendirilmiş içeriği dosya olarak kaydeder. Düğüm sayısı 30.000'i aşan dosyalarda ağaç görünümü performans için kapanır. Metin görünümü de ilk 800 bin karakteri ekrana basar, kopyalama ise içeriğin tamamını alır.
Dosya geçersizse üstte ayrıştırıcının hata mesajı, altta ham içerik görünür. 'Düzelt' ile metni düzenleyip kaydettiğinizde içerik yeniden denetlenir ve hata giderildiyse ağaç görünümü açılır. .json, .jsonl, .ndjson ve .geojson uzantıları bu görüntüleyiciye yönlendirilir. .jsonl ve .ndjson dosyaları (ya da bütün olarak JSON olmayıp her satırı ayrı JSON olan içerikler) satır satır ayrıştırılır: kayıtlar tabloda veya ağaçta listelenir, geçersiz satırlar satır numaralarıyla gösterilir.
Elinizde dosya değil de bir API yanıtı varsa, tarayıcının geliştirici araçlarında Ağ sekmesini açıp ilgili isteğin Yanıt bölümündeki metni kopyalayın ve .json uzantılı bir dosyaya kaydedin. Metindeki \u00e7 veya \u0131 gibi Unicode kaçış dizileri ağaç görünümünde ç ve ı olarak çözülmüş hâlde görünür; İndir ile aldığınız biçimlendirilmiş dosyada da bu karakterler kaçış dizisi yerine doğrudan yazılır. Değer aynıdır, yalnızca yazılışı değişir.
Doğrulamanın sınırı: söz dizimi, şema ve sayı hassasiyeti
Görüntüleyicinin yaptığı söz dizimi denetimidir: metin JSON kurallarına uyuyor mu? Verinin iş kurallarına uyup uymadığı başka bir sorudur. Bir tutar alanının sayı olması, bir tarihin belirli bir biçimde gelmesi ya da zorunlu bir alanın eksik olmaması JSON Schema gibi bir şema diliyle ve buna uygun bir doğrulama kütüphanesiyle denetlenir. Bu site şema doğrulaması yapmaz.
Sayı hassasiyeti de akılda tutulmalı. JavaScript sayıları 64 bit kayan noktalı olarak saklar ve 2 üzeri 53'ten büyük tam sayıları birebir tutamaz. 19 haneli bir kimlik numarası tarayıcıda okunurken yuvarlanabilir; örneğin 12345678901234567890 değeri ayrıştırma sonrası 12345678901234567000 olarak görünür. RFC 8259 de bu aralığın dışındaki sayıların sistemler arasında sorun çıkarabileceğini belirtir. Bu yüzden büyük kimlikleri metin olarak göndermek yaygın bir uygulamadır.
Tarih ve para tutarları için de JSON'un özel bir türü yoktur. Tarihler genellikle ISO 8601 biçiminde metin olarak (örneğin 2026-09-17T10:30:00Z) ya da Unix zaman damgası olarak sayı biçiminde gönderilir; hangisinin kullanıldığını görüntüleyici söyleyemez, API belgesine bakmak gerekir. Tutarlarda ise kuruş hassasiyetini korumak için değeri metin olarak ya da en küçük birim cinsinden tam sayı olarak taşımak sık görülen bir tercihtir.
YAML ile JSON arasında gidip geliyorsanız YAML görüntüleyici aynı ağaç görünümünü kullanır; YAML 1.2 JSON'un üst kümesi olarak tasarlandığından çoğu JSON dosyası YAML ayrıştırıcısından da geçer. Bir JWT'nin payload bölümü de Base64URL ile kodlanmış bir JSON'dur ve JWT Decoder ile okunabilir.
Bu rehberdeki araçlar
Anlatılan işlemleri hemen tarayıcınızda, dosyanız sunucuya yüklenmeden yapın:
Sık sorulan sorular
JSON dosyasına yorum ekleyebilir miyim?
Standart JSON'da yorum yoktur. Yorum gerekiyorsa JSONC, JSON5 veya YAML gibi biçimler kullanılır; ancak dosyayı okuyacak programın o biçimi desteklemesi gerekir.
Görüntüleyici anahtarların sırasını değiştirir mi?
Anahtarlar dosyadaki sırayla gösterilir, bir istisna dışında: JavaScript kuralı gereği '1', '2' gibi tam sayıya benzeyen anahtarlar diğer anahtarlardan önce ve küçükten büyüğe sıralanır.
Biçimlendirilmiş dosyayı indirince içerik değişir mi?
Değerler aynı kalır, yalnızca girinti ve satır sonları eklenir. Yinelenen anahtarlar ve çok büyük tam sayılar ayrıştırma sırasında değiştiği için indirilen dosyaya da bu yeni hâlleriyle yansır; bu tür verilerde özgün dosyayı saklayın.
JSON Lines dosyasını nasıl incelerim?
Her satır ayrı bir JSON belgesidir. .jsonl veya .ndjson uzantılı dosyayı görüntüleyiciye bırakmanız yeterli: her satır ayrı kayıt olarak tabloda listelenir, bir satıra tıklayınca tüm alanları ağaçta açılır. Ayrıştırılamayan satırlar numaralarıyla ayrıca gösterilir.
