JSON ve YAML: Hangi Yapılandırma Formatını Kullanmalısınız?
Hızlı Yanıt
API'ler, veri değişimi ve strict parsing&validation'ın önemli olduğu durumlar için JSON kullanın. Konfigürasyon dosyaları, DevOps manifest'leri ve insan okunabilirlik ve comment'lerin önemli olduğu durumlar için YAML kullanın. YAML bir JSON superset'idir —her geçerli JSON geçerli YAML'dir.
giriiş
JSON ve YAML her ikisi de insan-okunabilir veri serialization formatlarıdır. JSON strict, minimal ve web API'lerinde ubiquitous. YAML, JSON'un bir superset'i olup comment, multiline string, anchor ve indent tabanlı yapı ekler —bu da onu konfigürasyon dosyaları (Docker Compose, Kubernetes, CI/CD) için popüler yapar.
Adım adım
-
Sözdizimi ve okunabilirliği karşılaştırın
JSON parantez ve tırnak işaretleri kullanır: {"key": "value"}. YAML girinti ve iki nokta üst üste kullanır: anahtar: değer. YAML yapılandırma açısından daha temizdir; dizeler için tırnak işareti gerekmez, öğeler arasında virgül yoktur, kaşlı ayraç yoktur. JSON veri alışverişi açısından daha açıklayıcıdır ve hataya daha az eğilimlidir.
-
Özellikleri karşılaştırın
YAML şunları destekler: yorumlar (#), çok satırlı dizeler (|, >), bağlantılar (&) ve takma adlar (*), tek dosyada birden çok belge (---) ve karmaşık türler. JSON bunların hiçbirini desteklemiyor; yorum yok, çok satırlı dize yok, referans yok. JSON'nin basitliği kasıtlıdır: bu bir veri değişim biçimidir, bir yapılandırma dili değil.
-
Güvenliği ve ayrıştırmayı karşılaştırın
JSON ayrıştırma hızlı ve güvenlidir — JSON.parse her JavaScript motorunda yerleşiktir. YAML ayrıştırma daha yavaş ve daha karmaşıktır — YAML spesifikasyonu 80'den fazla sayfaya karşılık JSON'nin 2 sayfasıdır. YAML, JSON'nin sahip olmadığı güvenlik risklerine sahiptir (bağlantı noktaları aracılığıyla milyarlarca kahkaha saldırısı). Her zaman bağlantı noktalarını devre dışı bırakan güvenli bir YAML ayrıştırıcı kullanın.
-
Ekosistem kullanımını karşılaştırın
JSON: REST APIs, package.json, tsconfig.json, NoSQL veritabanları, web uygulamaları. YAML: Docker Compose, Kubernetes manifestleri, GitHub Eylemleri, Ansible playbook'ları, CI/CD yapılandırmaları, OpenAPI özellikleri. JSON çalışma zamanı verilerine hakimdir; YAML yapılandırmaya hakimdir.
-
Kullanım durumunuza göre karar verin
APIs, veri alışverişi, NoSQL, web uygulaması durumu: JSON. Yapılandırma dosyaları, DevOps, CI/CD, kod olarak altyapı: YAML. Eğer insanlar bunu elle yazıyorsa: YAML. Makineler bunu üretip tüketiyorsa: JSON.
Örnekler
JSON ve YAML'de aynı yapılandırma
Giriş: JSON: {"server": {"port": 8080, "host": "localhost"}}
YAML: server:\n port: 8080\n host: localhost
Çıkış: YAML %30 daha kısadır ve yorumları destekler. JSON daha katıdır ve evrensel olarak ayrıştırılabilir.
Yaygın Sorunlar
- YAML girintileme hataları: YAML, yapı için girinti kullanır ve tek bir yanlış boşluk, ayrıştırmayı bozar; YAML astarlı bir düzenleyici kullanın ve her zaman boşluk kullanın, sekme kullanmayın.
- YAML milyarlarca gülme saldırısı: YAML bağlantıları ve takma adları üstel genişleme oluşturarak DoS'a neden olabilir; bağlantıları devre dışı bırakan güvenli bir YAML ayrıştırıcı kullanın (örn. Python'da yaml.safe_load).
- JSON'de yorum yok: JSON spesifikasyonu yorumları yasaklayarak yapılandırma dosyalarına açıklama eklenmesini zorlaştırır; insan tarafından düzenlenen yapılandırma için YAML'yi, makine tarafından oluşturulan veriler için JSON kullanın.
- YAML örtülü yazma sürprizleri: YAML, evet/hayırı otomatik olarak booleanlara ve 1.0'ı kayan değere dönüştürür; bu da dize alanlarını bozabilir; beklenmeyen tür zorlamasını önlemek için dizeleri açıkça alıntılayın.
İpuçları
- İnsan tarafından yazılan yapılandırma için YAML'yi (Docker Compose, Kubernetes, CI/CD) ve makine tarafından oluşturulan veri alışverişi için JSON'yi (APIs, NoSQL, uygulama durumu) kullanın.
- Her zaman bağlantıları ve takma adları devre dışı bırakan güvenli bir YAML ayrıştırıcı kullanın; güvenilmeyen girişte asla genel amaçlı bir YAML yükleyici kullanmayın.
- YAML'yi JSON'ye dönüştürürken yorumların, çok satırlı dizelerin ve bağlantıların kaybolmasını bekleyin — JSON, YAML'nin bir alt kümesidir, özellikler için bunun tersi geçerli değildir.
- YAML'yi tutarlı bir şekilde 2 boşlukla girintileyin; sekmeleri ve boşlukları karıştırmak veya tutarsız girinti kullanmak en yaygın YAML ayrıştırma hatasıdır.