JSON Nedir ve Nasıl Kullanırsınız?

Yayınlanan: 2022-08-14
Bilgisayar monitörüne yerleştirilmiş "JSON" metninin resmi
Maria Vonotna/Shutterstock.com

JSON (JavaScript Object Notation), yapılandırılmış verileri temsil etmek için standartlaştırılmış bir formattır. JSON, JavaScript programlama dilinden doğmasına rağmen, artık sistemler arasında her yerde bulunan bir veri alışverişi yöntemidir. Günümüz API'lerinin çoğu, JSON isteklerini kabul eder ve JSON yanıtları verir; bu nedenle, biçim ve özellikleri hakkında iyi bir çalışma bilgisine sahip olmak yararlıdır.

Bu yazıda JSON'un ne olduğunu, farklı veri türlerini nasıl ifade ettiğini ve popüler programlama dillerinde nasıl üretip tüketebileceğinizi açıklayacağız. Ayrıca JSON'un bazı sınırlamalarını ve ortaya çıkan alternatifleri de ele alacağız.

JSON Temelleri

JSON ilk olarak Douglas Crockford tarafından tarayıcılar ve sunucular arasında veri iletişimi için durum bilgisi olmayan bir format olarak tasarlandı. 2000'lerin başında, web siteleri, ilk sayfa yüklendikten sonra, sunucularından eşzamansız olarak fazladan veri almaya başlıyordu. JavaScript'ten türetilen metin tabanlı bir biçim olan JSON, bu uygulamalarda veri getirmeyi ve tüketmeyi kolaylaştırdı. Spesifikasyon sonunda 2013 yılında ECMA-404 olarak standardize edildi.

JSON her zaman bir dize olarak iletilir. Bu dizelerin kodu, sayılar, booleanlar, diziler ve nesneler dahil olmak üzere bir dizi temel veri türüne çözülebilir. Bu, nesne hiyerarşilerinin ve ilişkilerinin iletim sırasında korunabileceği ve ardından alıcı tarafta programlama ortamına uygun bir şekilde yeniden birleştirilebileceği anlamına gelir.

Temel Bir JSON Örneği

Bu, bir blog gönderisinin JSON temsilidir:

 {
    "kimlik": 1001,
    "title": "JSON nedir?",
    "yazar": {
        "kimlik": 1,
        "isim": "James Walker"
    },
    "etiketler": ["api", "json", "programlama"],
    "yayınlandı": yanlış,
    "yayınlananZaman Damgası": boş
}

Bu örnek, tüm JSON veri türlerini gösterir. Ayrıca, API'lerde kullanım için bu kadar çekici kılan özelliklerden biri olan JSON biçimli verilerin kesinliğini de gösterir. Ayrıca, XML gibi daha ayrıntılı biçimlerin aksine, JSON'u olduğu gibi okumak nispeten kolaydır.

JSON Veri Türleri

JSON'da yerel olarak altı tür veri temsil edilebilir:

  • Dizeler – Dizeler çift tırnak işaretleri arasında yazılır; karakterler ters eğik çizgi kullanılarak kaçabilir.
  • Sayılar – Sayılar tırnak işaretleri olmadan rakamlarla yazılır. Bir kayan noktayı belirtmek için kesirli bir bileşen ekleyebilirsiniz. Çoğu JSON ayrıştırma uygulaması, ondalık nokta olmadığında bir tamsayı varsayar.
  • Booleanstrue ve false değişmez değerleri desteklenir.
  • Null – Boş veya atlanmış bir değeri belirtmek için null değişmez değer kullanılabilir.
  • Diziler – Bir dizi, köşeli parantezlerle gösterilen basit bir listedir. Listedeki her öğe virgülle ayrılır. Diziler herhangi bir sayıda öğe içerebilir ve desteklenen tüm veri türlerini kullanabilirler.
  • Nesneler – Nesneler küme parantezleriyle oluşturulur. Bunlar, anahtarların çift tırnak içine alınmış dizeler olduğu bir anahtar/değer çiftleri koleksiyonudur. Her anahtarın mevcut veri türlerinden herhangi birini alabilen bir değeri vardır. Basamaklı hiyerarşiler oluşturmak için nesneleri iç içe yerleştirebilirsiniz. Her değeri, o anahtar/değer çiftinin sonunu belirten bir virgül izlemelidir.

JSON ayrıştırıcıları bu veri türlerini otomatik olarak dillerine uygun yapılara dönüştürür. Örneğin, id bir tam sayıya manuel olarak aktarmanız gerekmez. Tüm JSON dizesinin ayrıştırılması, değerleri orijinal veri biçimlerine geri döndürmek için yeterlidir.

Anlambilim ve Doğrulama

JSON, verilerinizi kodlarken uyulması gereken belirli kurallara sahiptir. Sözdizimine uymayan dizeler tüketiciler tarafından ayrıştırılamaz.

Dizelerin ve nesne anahtarlarının etrafındaki tırnak işaretlerine dikkat etmek özellikle önemlidir. Ayrıca bir nesne veya dizideki her girişten sonra virgül kullanıldığından emin olmalısınız. JSON, son girişten sonra bir virgül izin vermez - istemeden dahil etmek, doğrulama hatalarının yaygın bir nedenidir. Çoğu metin düzenleyici, sözdizimi sorunlarını sizin için vurgulayarak hataların ortaya çıkmasına yardımcı olur.

Bu ortak gezi noktalarına rağmen, JSON elle yazması en kolay veri formatlarından biridir. Çoğu insan, alıştıktan sonra sözdizimini hızlı ve kullanışlı bulur. Genel olarak JSON, uyumsuz açılış ve kapanış etiketlerinin, geçersiz şema bildirimlerinin ve karakter kodlama sorunlarının genellikle sorunlara neden olduğu XML'den daha az hataya açık olma eğilimindedir.

JSON İçeriğini Belirleme

.json uzantısı normalde JSON bir dosyaya kaydedildiğinde kullanılır. JSON içeriği standartlaştırılmış MIME tipi application/json sahiptir, ancak text/json bazen uyumluluk nedenleriyle kullanılır. Günümüzde Accept ve Content-Type HTTP başlıkları için application/json güvenmelisiniz.

JSON kullanan çoğu API, her şeyi üst düzey bir nesnede kapsüller:

 {
    "hata": 1000
}

Ancak bu gerekli değildir – bir hazır bilgi türü bir dosyadaki en üst düzey düğüm olarak geçerlidir, bu nedenle aşağıdaki örneklerin tümü de geçerli JSON'dur:

 1000 
 doğru 
 hükümsüz

Programlama dilinizde kendi skalerlerine göre kod çözeceklerdir.

JSON ile Çalışmak

Çoğu programlama dilinde yerleşik JSON desteği bulunur. Birkaç popüler ortamda JSON verileriyle nasıl etkileşim kuracağınız aşağıda açıklanmıştır.

JavaScript

JavaScript'te JSON dizelerini kodlamak ve kodunu çözmek için JSON.stringify() ve JSON.parse() yöntemleri kullanılır:

 const yazı = {
    kimlik : 1001 ,
    başlık : "JSON Nedir?" ,
    yazar : {
        kimlik : 1 ,
        isim : "James Walker"
    }
} ;

const kodlanmışJson = JSON. stringify ( göndermek ) ;

// {"id": 1001, "title": "JSON Nedir?", ...}
konsol. günlük ( encodingJson ) ;

const kodu çözülmüşJson = JSON. ayrıştırma ( encodingJson ) ;

// James Walker
konsol. günlük ( decodingJson.yazar.ad ) ; _

PHP

PHP'deki eşdeğer işlevler json_encode() ve json_decode() 'dur:

 $yazı = [
    "id" => 1001 ,
    "title" => "JSON Nedir?" ,
    "yazar" => [
        "id" => 1 ,
        "isim" => "James Walker"
    ]
] ;

$encodingJson = json_encode ( $post ) ;

// {"id": 1001, "title": "JSON Nedir?", ...}
echo $encodingJson ;

$decodingJson = json_decode ( $encodingJson , true ) ;

// James Walker
echo $decodingJson [ "yazar" ] [ "isim" ] ;

piton

Python, sırasıyla seri hale getirmek ve seri durumdan çıkarmak için json.dumps() ve json.loads() sağlar:

 json'u içe aktar

gönderi = {
    "kimlik" : 1001 ,
    "başlık" : "JSON Nedir?" ,
    "yazar" : {
        "kimlik" : 1 ,
        "isim" : "James Walker"
    }
}

kodlanmışJson = json. çöplükler ( posta )

# {"id": 1001, "title": "JSON Nedir?", ...}
yazdır ( kodlanmışJson )

kodu çözülmüşJson = json. yükler ( kodlanmışJson )

#James Walker
print ( decodingJson [ "yazar" ] [ "isim" ] )

yakut

Ruby, JSON.generate ve JSON.parse sunar:

 "json" gerektirir

gönderi = {
    "id" => 1001 ,
    "title" => "JSON Nedir?" ,
    "yazar" => {
        "id" => 1 ,
        "isim" => "James Walker"
    }
}

kodlanmışJson = JSON. oluşturmak ( göndermek )

# {"id": 1001, "title": "JSON Nedir?", ...}
kodlanmışJson koyar

kodu çözülmüşJson = JSON. ayrıştırma ( kodlanmışJson )

#James Walker
decodingJson [ "yazar" ] [ "ad" ] koyar

JSON Sınırlamaları

JSON, veri yapınızdaki değerleri aktarmaya odaklanan hafif bir biçimdir. Bu, ayrıştırmayı hızlı ve çalışmayı kolaylaştırır, ancak hayal kırıklığına neden olabilecek dezavantajların olduğu anlamına gelir. İşte en büyük sorunlardan bazıları.

Yorum yok

JSON verileri yorum içeremez. Ek açıklamaların olmaması netliği azaltır ve sizi belgeleri başka bir yere koymaya zorlar. Bu, yapılandırma dosyaları gibi, değişikliklerin seyrek olduğu ve alanların amaçlarının belirsiz olabileceği durumlar için JSON'u uygunsuz hale getirebilir.

Şema Yok

JSON, verileriniz için bir şema tanımlamanıza izin vermez. Örneğin, bu id zorunlu bir tamsayı alanı olduğunu zorlamanın bir yolu yoktur. Bu, istemeden hatalı biçimlendirilmiş veri yapılarına yol açabilir.

Referans Yok

Alanlar, veri yapısındaki diğer değerlere başvuramaz. Bu genellikle dosya boyutunu artıran tekrarlara neden olur. Daha önceki blog gönderisi örneğine dönersek, aşağıdaki gibi bir blog gönderileri listesine sahip olabilirsiniz:

 {
    "gönderiler": [
        {
            "kimlik": 1001,
            "title": "JSON nedir?",
            "yazar": {
                "kimlik": 1,
                "isim": "James Walker"
            }
        },
        {
            "kimlik": 1002,
            "title": "SaaS nedir?",
            "yazar": {
                "kimlik": 1,
                "isim": "James Walker"
            }
        }
    ]
}

Her iki gönderi de aynı yazara sahip, ancak bu nesneyle ilişkili bilgilerin çoğaltılması gerekiyordu. İdeal bir dünyada, JSON ayrıştırıcı uygulamaları, aşağıdakine benzer girdilerden yukarıda gösterilen yapıyı üretebilecektir:

 {
    "gönderiler": [
        {
            "kimlik": 1001,
            "title": "JSON nedir?",
            "yazar": "{{ .authors.james }}"
        },
        {
            "kimlik": 1002,
            "title": "SaaS nedir?",
            "yazar": "{{ .authors.james }}"
        }
    ],
    "yazarlar": {
        "james": {
            "kimlik": 1,
            "isim": "James Walker"
        }
    }
}

Bu, şu anda standart JSON ile mümkün değildir.

Gelişmiş Veri Türü Yok

Desteklenen altı veri türü, birçok yaygın değer türünü atlar. JSON, tarihleri, saatleri veya coğrafi konum noktalarını yerel olarak depolayamaz, bu nedenle bu bilgi için kendi biçiminize karar vermeniz gerekir.

Bu, uygunsuz tutarsızlıklara ve uç durumlara neden olur. Uygulamanız zaman damgalarını 2022-07-01T12:00:00+00:00 gibi dizeler olarak işliyorsa, ancak harici bir API, zamanı Unix çağını ( 1657287000 ) geçen saniyeler olarak sunuyorsa, her birinin ne zaman kullanılacağını hatırlamanız gerekir. biçimler.

JSON Alternatifleri

YAML, önde gelen JSON alternatifidir. Daha insan tarafından okunabilir bir sunuma, özel veri türlerine ve referanslar için desteğe sahip olan biçimin bir üst kümesidir. JSON ile ilgili kullanılabilirlik zorluklarının çoğunu ele almayı amaçlamaktadır.

YAML, yapılandırma dosyaları ve DevOps, IaC ve gözlemlenebilirlik araçları içinde geniş çapta benimsenmiştir. API'ler için veri değişim formatı olarak daha az kullanılır. YAML'nin göreceli karmaşıklığı, yeni gelenler için daha az ulaşılabilir olduğu anlamına gelir. Küçük sözdizimi hataları, kafa karıştırıcı ayrıştırma hatalarına neden olabilir.

Protokol arabellekleri (protobuf'lar), yapılandırılmış verileri seri hale getirmek için tasarlanmış, gelişmekte olan bir başka JSON yarışmacısıdır. Protobuf'lar, veri türü bildirimlerine, gerekli alanlara ve çoğu büyük programlama dili için desteğe sahiptir. Sistem, ağlar üzerinden veri iletmenin daha verimli bir yolu olarak popülerlik kazanıyor.

Özet

JSON, altı farklı veri türünü kodlayabilen metin tabanlı bir veri gösterim biçimidir. JSON, yazılım geliştirme ekosisteminin temel unsuru haline geldi; tüm büyük programlama dilleri tarafından desteklenir ve son birkaç on yılda geliştirilen çoğu REST API'si için varsayılan seçenek haline gelmiştir.

JSON'un sadeliği popülaritesinin bir parçası olsa da, formatla elde edebileceklerinize sınırlamalar getirir. Şemalar, yorumlar, nesne referansları ve özel veri türleri için desteğin olmaması, bazı uygulamaların JSON ile mümkün olanı aştığını görecekleri anlamına gelir. YAML ve Protobuf gibi daha genç alternatifler bu zorlukların üstesinden gelinmesine yardımcı olurken, XML bir veri şeması tanımlamak isteyen ve ayrıntıyı önemsemeyen uygulamalar için bir rakip olmaya devam ediyor.