ToolHub
View All Posts

JSON Formatlama En İyi Uygulamaları

JSON (JavaScript Object Notation), web'de veri alışverişi için fiili standart haline gelmiştir. API'ler JSON döndürür, yapılandırma dosyaları JSON kullanır ve hatta veritabanları JSON belgeleri depolar. Basitliğine rağmen JSON, ihlal edilmesi kolay katı sözdizimi kurallarına sahiptir ve kötü formatlanmış JSON hata ayıklama zorluklarına, performans sorunlarına ve güvenlik açıklarına yol açabilir. Bu kılavuz, temel sözdiziminden Schema doğrulaması ve büyük dosyaları işleme gibi ileri konulara kadar JSON'ı doğru formatlama hakkında bilmeniz gereken her şeyi kapsar.

JSON Nedir?

JSON, JavaScript nesne literal sözdiziminden türetilen hafif, metin tabanlı bir veri değişim formatıdır. 2000'lerin başında Douglas Crockford tarafından belirtilmiş ve ECMA-404 ve RFC 8259 olarak standartlaştırılmıştır. JSON'ın tasarım hedefleri basitlik, insan tarafından okunabilirlik ve programlama dilleri arasında kolay uygulanabilirliktir. Bugün her büyük programlama dili yerleşik JSON desteği içerir.

JSON altı veri türünü destekler: dizeler (çift tırnak), sayılar (tamsayı ve kayan nokta), boolean değerler (true ve false), null değeri, nesneler (sırasız anahtar-değer koleksiyonları) ve diziler (sıralı listeler). Yorumları, tarihleri, ikili verileri veya undefined değerleri doğal olarak desteklemez.

JSON Sözdizimi Kuralları

JSON'ın kesinlikle uyulması gereken bir sözdizimi vardır. Tek bir karakter hatası bile tüm belgenin ayrıştırılamamasına neden olabilir. Bu kuralları anlamak en yaygın formatlama hatalarını önler.

Dizeler Çift Tırnak Kullanmalıdır

Tüm dize değerleri ve nesne anahtarları çift tırnak içine alınmalıdır. Tek tırnak geçerli bir JSON dize sınırlayıcısı değildir. Bu, JavaScript'ten gelen ve tek ve çift tırnağın birbirinin yerine kullanılabildiği geliştiricilerin en yaygın hatalarından biridir.

// Invalid - single quotes
{'name': 'Alice', 'age': 30}

// Valid - double quotes
{"name": "Alice", "age": 30}

Nesne Anahtarları Tırnak İçinde Olmalıdır

JavaScript nesne literallerinden farklı olarak, JSON tüm nesne anahtarlarının çift tırnak içine alınmasını gerektirir. Tırnaksız anahtarlar sözdizimi hatasıdır.

// Invalid - unquoted keys
{name: "Alice", age: 30}

// Valid - quoted keys
{"name": "Alice", "age": 30}

Sondaki Virgül Yasaktır

JSON, bir nesne veya dizinin son öğesinden sonra virgüle izin vermez. Bu, JavaScript'te sondaki virgüle izin verilen (hatta bazı stil kılavuzlarında teşvik edilen) JavaScript geliştiricilerinin bir başka yaygın hatasıdır.

// Invalid - trailing comma
{
  "name": "Alice",
  "age": 30,
}

// Valid - no trailing comma
{
  "name": "Alice",
  "age": 30
}

Yorumlar Desteklenmez

JSON yorumları desteklemez. // tek satırlı yorumlar ve /* */ çok satırlı yorumlar JSON'da geçersizdir. Belgeleme eklemeniz gerekiyorsa, ayrı belgeleme dosyaları veya bazı araçlar tarafından desteklenen JSONC (Yorumlu JSON) formatını kullanmayı düşünün.

Katı Değer Türleri

JSON değerleri altı desteklenen türden biri olmalıdır. undefined, NaN, Infinity ve -Infinity geçerli JSON değerleri değildir. Bunlardan herhangi birini içermek ayrıştırma hatalarına neden olur veya birçok ayrıştırıcının reddedeceği standart dışı JSON üretir.

Yaygın Formatlama Hataları

Sözdizimi hatalarının ötesinde, teknik olarak geçerli ancak sorunlu JSON üreten birkaç formatlama hatası vardır:

Pretty Print ve Sıkıştırma

JSON'ın iki ana formatlama modu farklı amaçlara hizmet eder ve doğru bağlamda doğru formatı kullanmak önemlidir.

Pretty Print JSON

Pretty print, JSON'ı insan tarafından okunabilir hale getirmek için girinti ve satır sonları ekler. Bu, geliştirme, hata ayıklama ve belgeleme sırasında çok önemlidir. Çoğu JSON formatlayıcı varsayılan olarak 2 boşluk girintisi kullanır:

{
  "users": [
    {
      "id": 1,
      "name": "Alice",
      "email": "alice@example.com"
    },
    {
      "id": 2,
      "name": "Bob",
      "email": "bob@example.com"
    }
  ]
}

Sıkıştırılmış JSON

Sıkıştırma, mümkün olan en küçük geçerli JSON'ı üretmek için tüm gereksiz boşlukları kaldırır. Bu, her baytın önemli olduğu üretim API'leri için çok önemlidir:

{"users":[{"id":1,"name":"Alice","email":"alice@example.com"},{"id":2,"name":"Bob","email":"bob@example.com"}]}

Hangisi Ne Zaman Kullanılır

BağlamFormatNeden
Geliştirme ve hata ayıklamaPretty printOkunabilirlik ve hızlı tarama
Yapılandırma dosyalarıPretty printİnsanların bu dosyaları okuması ve düzenlemesi gerekir
Üretim API yanıtlarıSıkıştırılmışDaha küçük yük, daha hızlı aktarım
Günlük dosyalarıSıkıştırılmış (satır başına bir nesne)Kompakt depolama, grep ile aranabilir
Sürüm kontrolüPretty printAnlamlı diff'ler ve daha az birleştirme çakışması
En İyi Uygulama: JSON'ı sürüm kontrolünde her zaman formatlanmış biçimde saklayın. Sıkıştırmayı dağıtımdan önce bir derleme adımı olarak yapın. Bu şekilde okunabilir diff'ler elde ederken üretimde sıkıştırılmış JSON'ın performans avantajından yararlanırsınız.

JSON Schema Doğrulaması

JSON sözdizimi doğrulaması bir belgenin iyi formatlanmış olup olmadığını kontrol ederken, verilerin beklenen yapıya, türlere veya değerlere sahip olup olmadığını doğrulamaz. JSON Schema, JSON verilerinin beklenen şeklini tanımlayan bir kelime dağarcığı sağlayarak bu boşluğu doldurur.

JSON Schema Nedir?

JSON Schema, diğer JSON belgelerinin yapısını tanımlayan bir JSON belgesidir. Zorunlu alanları, beklenen türleri, değer aralıklarını, dize desenlerini ve iç içe nesne yapılarını belirtmenize olanak tanır. Schema'ya uyan bir JSON belgesine geçerli örnek denir.

Yaygın Schema Özellikleri

Schema Doğrulaması Ne Zaman Kullanılır

Dış kaynaklardan JSON aldığınızda her zaman JSON Schema doğrulaması kullanmalısınız: API istek gövdeleri, yapılandırma dosyaları, veri içe aktarmaları ve mesaj kuyruğu yükleri. Schema doğrulaması hataları erken yakalar, net hata mesajları sağlar ve veri formatları için canlı belgeleme görevi görür. Ajv (JavaScript), jsonschema (Python) ve json-schema-validator (Java) gibi kütüphaneler, Schema doğrulamasını herhangi bir uygulamaya entegre etmeyi kolaylaştırır.

JSON Boyutunun Performans Etkisi

JSON belgelerinin boyutu, uygulama performansını birden fazla boyutta doğrudan etkiler: ağ aktarım süresi, ayrıştırma süresi ve bellek tüketimi. Bu etkileri anlamak, JSON formatlama ve yapılandırma hakkında bilinçli kararlar vermenize yardımcı olur.

Ağ Aktarımı

JSON'ın her baytı ağ üzerinden sunucudan istemciye aktarılmalıdır. Hızlı bağlantılarda 10KB ile 100KB arasındaki fark önemsiz görünebilir, ancak mobil ağlarda veya daha yavaş internet bölgelerindeki kullanıcılar için etki önemlidir. Araştırmalar, her 100 ms'lik yükleme süresi artışının dönüşüm oranlarını yaklaşık %1 azalttığını göstermektedir. Sıkıştırma genellikle JSON boyutunu %30-50 azaltır, gzip sıkıştırması ek %70-85 azaltma sağlar. JSON API yanıtları için her zaman gzip veya Brotli sıkıştırmasını etkinleştirin.

Ayrıştırma Performansı

JSON ayrıştırma şaşırtıcı derecede maliyetlidir. Büyük belgeler için (1MB'ın üzerinde), mobil cihazlarda ayrıştırma yüzlerce milisaniye sürebilir. Maliyet, belge boyutuyla kabaca doğrusaldır. Ayrıştırma maliyetini azaltmak için temel stratejiler: yalnızca istemcinin ihtiyaç duyduğu verileri gönderme (alan filtreleme), büyük sonuç kümeleri için sayfalama ve insan tarafından okunabilirliğin gerekmediği dahili servis iletişiminde Protocol Buffers veya MessagePack gibi daha verimli serileştirme formatları kullanma.

Bellek Kullanımı

Ayrıştırılmış JSON, her değer kendi bellek tahsisine sahip bağımsız bir nesne haline geldiği için genellikle serileştirilmiş formundan 3-10 kat daha fazla bellek tüketir. 1MB'lık bir JSON dizesi ayrıştırıldıktan sonra 5-10MB RAM kullanabilir. Tarayıcıda çalışan ve sınırlı belleğe sahip JavaScript uygulamaları için bu, düşük kaliteli cihazlarda performans düşüşüne veya çökmelere yol açabilir.

JSON ve JSONL

JSON Lines (JSONL veya NDJSON), JSON'ın önemli bir sınırlamasını ele alan ilgili bir formattır: tüm belgenin tek bir birim olarak ayrıştırılması gerekliliği. JSONL'de, dosyanın her satırı tam, bağımsız bir JSON nesnesidir.

JSONL Ne Zaman Kullanılır

Ne Zaman Standart JSON Kullanılır

Büyük JSON Dosyalarını İşleme

Büyük JSON dosyaları (10MB'ın üzerinde), özel işleme gerektiren benzersiz zorluklar sunar. Standart ayrıştırma yöntemleri bu ölçekte başarısız olabilir veya düşük performans gösterebilir.

Akış Ayrıştırıcıları

Akış (veya SAX tarzı) ayrıştırıcılar, tüm belgeyi belleğe yüklemeden JSON'ı artımlı olarak işler. Nesne başlangıcı, anahtar-değer çiftleri ve dizi öğeleri gibi yapısal öğelerle karşılaştıkça olaylar yayarlar. Bu yaklaşım, dosya boyutundan bağımsız olarak sabit bellek kullanır. oboe.js (JavaScript), ijson (Python) ve Jackson Streaming API (Java) gibi kütüphaneler akış JSON ayrıştırma sağlar.

Büyük Dosyalar için Pratik İpuçları

JSON Güvenlik Hususları

JSON bir veri formatıdır ve kendisi güvensiz değildir, ancak uygulamaların JSON'ı işleme şekli güvenlik açıklarına yol açabilir. Bu riskleri anlamak, güvenli sistemler inşa etmek için çok önemlidir.

JSON Ayrıştırmak için Asla eval() Kullanmayın

En kritik güvenlik kuralı: JSON ayrıştırmak için asla JavaScript'in eval() fonksiyonunu kullanmayın. eval() rastgele JavaScript kodu çalıştırır, yani kötü amaçlı JSON yükleri kullanıcının makinesinde kod çalıştırabilir. Her zaman yalnızca geçerli JSON'ı ayrıştıran ve çalıştırılabilir kodu reddeden JSON.parse() kullanın. Bu tartışılamaz.

JSONP ve Siteler Arası Riskler

JSONP (Paddingli JSON), CORS yaygın olarak desteklenmeden önce aynı köken politikası kısıtlamalarını aşmak için kullanılan bir teknikti. JSON verilerini script olarak çalıştırılan bir fonksiyon çağrısına sararak çalışır. Bu, üçüncü taraf sunuculardan rastgele JavaScript çalıştırdığı için doğası gereği tehlikelidir. Hem istemciyi hem de sunucuyu kontrol ediyorsanız, JSONP yerine CORS kullanın. JSONP eski bir teknoloji olarak kabul edilmeli ve yeni uygulamalarda kaçınılmalıdır.

Prototip Kirliliği

JavaScript'te JSON nesnelerini birleştirirken veya derin kopyalarken, __proto__, constructor ve prototype gibi anahtarlara dikkat edin. Kullanıcı tarafından sağlanan JSON bu anahtarlar temizlenmeden mevcut bir nesneye özyinelemeli olarak birleştirilirse, uygulamadaki tüm nesnelerin prototipini değiştirerek yetki yükseltmesine veya hizmet reddine yol açabilir. Birleştirmeden önce her zaman nesne anahtarlarını temizleyin.

Derin İç İçe Yerleştirme ile Hizmet Reddi

Aşırı iç içe yerleştirme derinliğine (binlerce seviye) sahip özel olarak hazırlanmış JSON belgeleri, özyinelemeli ayrıştırıcılarda yığın taşması hatalarına neden olabilir. Ayrıştırıcıda maksimum iç içe yerleştirme derinliği ayarlayarak bunu azaltın. Çoğu üretim JSON ayrıştırıcısı bu sınırı yapılandırmanıza izin verir.

Girdi Doğrulaması

Dış kaynaklardan gelen JSON verilerine asla güvenmeyin. Kullanmadan önce her zaman gelen JSON'ın yapısını, türlerini ve değer aralıklarını doğrulayın. JSON Schema doğrulaması en sağlam yaklaşımdır, ancak zorunlu alanlar ve tür kontrolleri için basit kontroller bile hatalı biçimlendirilmiş veya kötü amaçlı girdilere karşı önemli koruma sağlar.

JSON'ı formatlamanız, doğrulamanız veya sıkıştırmanız mı gerekiyor? Ücretsiz çevrimiçi JSON araçlarımızı deneyin. Tüm işlemler tarayıcınızda gerçekleşir, maksimum hız ve gizlilik sağlar.

JSON Formatlama AracıJSON Doğrulayıcı

Sıkça Sorulan Sorular

Pretty print ve sıkıştırılmış JSON arasındaki fark nedir?

Pretty print JSON, insan tarafından okunması için boşluk (girinti, satır sonları) içerirken, sıkıştırılmış JSON dosya boyutunu en aza indirmek için tüm gereksiz boşlukları kaldırır. Geliştirme ve hata ayıklama sırasında pretty print JSON, üretim ortamlarında daha küçük ağ yükleri ve daha hızlı ayrıştırma için sıkıştırılmış JSON kullanın.

En yaygın JSON formatlama hataları nelerdir?

En yaygın hatalar şunlardır: nesne veya dizinin son öğesinden sonra sondaki virgül, çift tırnak yerine tek tırnak kullanma, yorum ekleme (JSON yorumları desteklemez), tırnaksız nesne anahtarları kullanma ve undefined veya NaN gibi geçerli olmayan JSON değerleri ekleme.

Ne zaman JSON yerine JSONL kullanmalıyım?

Kayıtları artımlı olarak işlemeniz gerektiğinde JSONL (JSON Lines) kullanın, örneğin günlük dosyaları, veri akışları veya belleğe sığmayan büyük veri kümeleri. Her satır tam bir JSON nesnesidir, böylece tüm dosyayı yüklemeden her seferinde bir satır okuyup ayrıştırabilirsiniz. Standart JSON, herhangi bir veriye erişmeden önce tüm belgenin ayrıştırılmasını gerektirir.

JSON'ı Schema'ya göre nasıl doğrularım?

JSON verilerinin beklenen yapısını tanımlamak için JSON Schema kullanın, ardından Ajv (JavaScript), jsonschema (Python) gibi kütüphaneleri veya çevrimiçi doğrulayıcıları kullanarak örnekleri bu Schema'ya göre doğrulayın. JSON Schema, zorunlu alanları, türleri, değer aralıklarını, dize desenlerini ve iç içe nesne yapılarını belirtmenize olanak tanır.

JSON veri alışverişi için güvenli midir?

JSON'un kendisi ne güvenli ne de güvensiz olan bir veri formatıdır. Ancak, JSON'ı ayrıştırma ve kullanma şekliniz güvenlik açıklarına yol açabilir. Birincil risk, JSON ayrıştırmak için eval() kullanmaktır (asla yapmayın — her zaman JSON.parse() kullanın). Ayrıca, aynı köken politikasını atlayabilecek JSONP'ye karşı dikkatli olun. Güvenilmeyen kaynaklardan gelen JSON verilerini kullanmadan önce her zaman doğrulayın ve temizleyin.