Bu Örnekteki Sözdizimi Hatası
Yukarıdaki girdi neredeyse geçerli JSON’dur. Sorun, ikinci kullanıcı nesnesinde false değerinden sonra gelen sonda virgüldür:
{"name": "Bob", "active": false,}
Bu virgülü kaldırın ve belge geçerli olur:
{
"users": [
{"name": "Alice", "active": true},
{"name": "Bob", "active": false}
]
}
Bu, geliştiricilerin karşılaştığı en yaygın JSON hatasıdır ve JavaScript tolere ettiği için gözden kaçırmak kolaydır.
JSON’ı Geçerli Yapan Nedir
JSON sözdizimi RFC 8259 ile tanımlanır. Kurallar çoğu insanın beklediğinden daha basittir. Geçerli bir JSON belgesi şunlardan biridir: bir nesne, dizi, string, sayı, boolean (true veya false) veya null. Nesneler, anahtar-değer çiftleri koleksiyonlarıdır. Anahtarlar string olmalıdır (çift tırnaklı). Değerler herhangi bir JSON değeri olabilir. Diziler, sıralı JSON değer listeleridir.
Geliştiricileri en sık takılan yapısal kurallar:
Sonda virgüller
Bir dizideki son öğe veya bir nesnedeki son anahtar sonda virgül içermemelidir. [1, 2, 3,] geçersizdir. {"a": 1, "b": 2,} geçersizdir.
String tırnaklama
Tüm stringler çift tırnak kullanmalıdır. 'Alice' geçerli JSON değildir. "Alice" geçerlidir.
Anahtar tırnaklama
Nesne anahtarları tırnaklı stringler olmalıdır. {name: "Alice"} JSON değildir. {"name": "Alice"} JSON’dur.
Yorum yok
JSON’da yorum sözdizimi yoktur. // yorum ve /* yorum */ ayrıştırma hatasına neden olur. Bu, yapılandırma dosyalarında yorumları destekleyen dillerden gelenleri şaşırtır.
Özel float değerleri
NaN, Infinity ve -Infinity geçerli JSON değerleri değildir. JavaScript NaN değerini JSON.stringify() ile JSON’a serileştirmeye çalışırsanız null alırsınız. Python’un json.dumps() varsayılan olarak ValueError fırlatır.
En Yaygın 5 JSON Sözdizimi Hatası
| Hata | Örnek | Düzeltme |
|---|---|---|
| Sonda virgül | {"a": 1,} | {"a": 1} |
| Tek tırnaklı stringler | {'key': 'value'} | {"key": "value"} |
| Tırnaksız anahtarlar | {key: "value"} | {"key": "value"} |
| Yorumlar | {"a": 1 // not} | Yorumları kaldırın |
| NaN veya undefined | {"val": NaN} | null ile değiştirin |
Komut Satırında JSON Doğrulama
Tarayıcı olmadan hızlı doğrulama için jq standart araçtır. Girdi geçersiz JSON ise sıfır olmayan bir kodla çıkar, bu da betiklerde kullanışlı olmasını sağlar.
Bir dosyayı doğrulama:
jq . file.json
Bir string’i doğrulama:
echo '{"name": "Alice",}' | jq .
# parse error (Expected another key-value pair or '}')
Python’un standart kütüphanesi de herhangi bir bağımlılık olmadan doğrulama yapar:
python3 -m json.tool file.json
CI boru hatları için her iki araç da hatalı girdide yüksek sesle başarısız olan doğrulama adımları olarak çalışır.
JSON vs JSONC vs JSON5
| Format | Yorumlar | Sonda virgüller | Tek tırnaklar | Kullanım alanı |
|---|---|---|---|---|
| JSON | Hayır | Hayır | Hayır | Veri alışverişi, API’ler |
| JSONC | Evet | Evet | Hayır | Yapılandırma dosyaları (VS Code) |
| JSON5 | Evet | Evet | Evet | Yapılandırma dosyaları (Babel, ESLint) |
Bir API oluşturuyor veya bir kütüphane tarafından ayrıştırılacak veri yazıyorsanız, katı JSON kullanın. Belirli bir aracın okuyacağı bir yapılandırma dosyası yazıyorsanız, o aracın hangi formatı beklediğini kontrol edin. Bunları karıştırmak, yapılandırma dosyaları standart ayrıştırıcılara aktarıldığında sessiz hataların yaygın bir kaynağıdır.
Spesifikasyon
RFC 8259, 2017’de yayınlanan mevcut JSON spesifikasyonudur. RFC 7159’un yerini almıştır. Spesifikasyon yaklaşık 20 dakikada okunabilir ve bir kez göz atmaya değer. Dilbilgisini resmi olarak tanımlar, sayı hassasiyetini kapsar ve UTF-8 kodlamasını belirtir. Spesifikasyondan önemli bir nokta: bir JSON ayrıştırıcısının bir nesnedeki yinelenen anahtarları kabul etmesine veya reddetmesine izin verilir. Çoğu ayrıştırıcı bunları kabul eder ve son değeri kullanır, ancak davranış tanımsızdır ve buna güvenmemelisiniz.