Aynı veri iki biçimde
JSON'da küçük bir yapılandırma şöyle görünür: {"name": "shop", "port": 8080, "debug": false, "hosts": ["a.example.com", "b.example.com"]}. YAML'da aynı veri süslü parantez yerine girintiyle yazılır: bir satırda name: shop, sonraki satırda port: 8080, ardından debug: false ve hosts: satırının altında tireyle başlayan iki girintili satır.
İkisi de her programlama dilinde birebir aynı nesneye yüklenir. Fark, nasıl yazıldıklarında ve her biçimin başka neye izin verdiğindedir.
| JSON | YAML | |
|---|---|---|
| Yapı | Süslü ve köşeli parantezler | Girinti, istersen süslü parantez |
| Metin | Her zaman çift tırnak içinde | Tırnak çoğu zaman gerekmez |
| Yorumlar | Yazılamaz | # ile başlayan satırlar |
| Çok satırlı metin | Sadece metin içinde \n ile | | ya da > ile bloklar |
| Parçaları yeniden kullanma | Mümkün değil | Anchor (&ad) ve alias (*ad) |
| Tek dosyada birden çok belge | Hayır | Evet, üç tireden oluşan bir satırla ayrılır |
| Tipik kullanım | API'ler, veri alışverişi, tarayıcılar | Yapılandırma: Docker Compose, Kubernetes, CI |
Burada dene: YAML'dan JSON'a
Aracın tam sayfasını açYAML yazması neden keyifli
YAML daha az karakter ister. Saymak zorunda kalacağın kapanış parantezleri, öğeler arasında unutulacak virgüller ve çoğu metnin etrafında tırnak yoktur. Yorumlar bir ayarın neden var olduğunu açıklamana izin verir; Docker Compose, Kubernetes, GitHub Actions ve Ansible gibi insanların her gün düzenlediği araçların onu seçmesinin nedeni budur.
Anchor'lar tekrarı önler: bir bloğu &defaults ile bir kez tanımlar, *defaults ile yeniden kullanır ya da <<: *defaults ile başka bir bloğa katıp tek tek anahtarları ezersin. Blok metin satır sonlarını korur, bu da betikleri ve uzun mesajları dosyanın içinde okunur kılar.
Verini değiştiren YAML tuzakları
Tırnakları atlama özgürlüğünün bir bedeli var: YAML tırnaksız her değerin tipini tahmin eder ve bu tahmin her zaman kastettiğin şey olmaz. Bu sorunların çoğu metin tırnak içine alındığında ortadan kalkar.
- Norveç sorunu: birçok aracın hâlâ kullandığı YAML 1.1'de NO, no, yes, on ve off boolean'dır. Norveç için NO içeren bir ülke kodu listesi false'a dönüşür.
- Sürüm numaraları: 1.10, 1.1 sayısı olur, 3.0 da 3'e dönüşebilir. Metin olarak kalması için "1.10" yaz.
- Baştaki sıfırlar: 0123 gibi posta kodları ve ürün kodları sayıya dönüşebilir, YAML 1.1 onları sekizlik okur, yani 0123 83 olur.
- Saatler: YAML 1.1'de 12:30, 60 tabanında bir sayıdır, yani 750.
- İki nokta ve diyez: ": " ya da " #" içeren bir değer erken biter ya da bir yorum başlatır. Böyle metinleri tırnak içine al.
- Sekmeler: YAML girinti için sekmeye izin vermez, bir boşluk fazla girintilenmiş anahtar da bazı editörlerde hiçbir hata vermeden yanlış bloğa düşer.
JSON programlar için neden daha iyi
JSON'da her şeyin tek bir yazımı vardır ve tahmin yoktur: metin her zaman tırnak içindedir, bu yüzden "NO" metin kalır, 1.10 da açıkça bir sayıdır. Ayrıştırıcıları küçük, hızlı ve her dilde vardır, tarayıcılar JSON'u kendiliğinden okur. Bu da API yanıtları, loglar, önbellekler ve veri dosyaları gibi yazılımın üretip okuduğu her veride JSON'u daha güvenli seçim yapar.
En sık duyulan şikâyet yorum olmamasıdır. Bazı araçlar yorumlu JSON'u kabul eder (genelde JSONC denir), ama standart ayrıştırıcılar onu reddeder; bu yüzden başka programların okuması gereken dosyalar için iyi bir biçim değildir.
YAML ile JSON arasında güvenle dönüştürme
YAML 1.2, JSON'u kapsayacak şekilde tasarlandı, bu yüzden neredeyse her JSON belgesi aynı zamanda geçerli bir YAML'dır. Ters yön gerçek bir ayrıştırıcı ister, çünkü YAML özellikleri çözülmelidir: anchor ve merge key'ler açılır, blok metin \n içeren bir metne dönüşür, birden çok belge bir liste olur. JSON'da yorumlara yer olmadığı için yorumlar taşınamaz.
JSON'u YAML'a çevirirken bir YAML okuyucunun yanlış okuyabileceği her değer tırnağa alınmalıdır. Bu sayfadaki dönüştürücü her metin değerini hem YAML 1.1 hem YAML 1.2 kurallarına göre kontrol eder ve sadece gerektiğinde tırnağa alır, böylece yes, NO, 0123 ve 1.10 değişmeden geri gelir. Sonucu Ters çevir ile geri çevirmek, hiçbir şeyin değişmediğini göstermenin hızlı bir yoludur.
Hangisini kullanmalısın?
Kısa cevap: insanlar yazıyorsa YAML, programlar yazıp okuyorsa JSON. Ayrıntılı olarak şu kurallar işini görür:
- İnsanların elle yazıp incelediği yapılandırma için, özellikle yorumlar işe yarıyorsa YAML kullan.
- Programların birbiriyle paylaştığı, sakladığı ya da ağ üzerinden gönderdiği veriler için JSON kullan.
- Dosya kodla üretiliyorsa, sonradan bir insan okuyacak olsa bile JSON kullan.
- Bir araç ikisini de kabul ediyorsa, ki çoğu eder, ekibinin zaten kullandığı biçimde kal: tutarlılık küçük farklardan daha önemlidir.
- YAML'da kalıyorsan sayı, tarih ya da yes/no gibi görünen metin değerlerini tırnağa al ve dosyaları yayına almadan önce bir ayrıştırıcıyla kontrol et.