YAML ve JSON arasındaki fark ne?

JSON ve YAML aynı tür veriyi anlatır: nesneler, listeler, metin, sayılar, true, false ve null. JSON katıdır ve programlar için yapılmıştır; YAML esnektir ve yapılandırmayı elle yazan insanlar için yapılmıştır. Bu rehber ikisini yan yana karşılaştırıyor, değerleri sessizce değiştiren YAML kurallarını gösteriyor ve ikisi arasında sürprizsiz dönüştürmeyi anlatıyor. Aşağıdaki dönüştürücü tarayıcında çalışır, okurken her örneği deneyebilirsin.

4 dk okuma

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.

JSONYAML
YapıSüslü ve köşeli parantezlerGirinti, istersen süslü parantez
MetinHer zaman çift tırnak içindeTırnak çoğu zaman gerekmez
YorumlarYazılamaz# ile başlayan satırlar
Çok satırlı metinSadece metin içinde \n ile| ya da > ile bloklar
Parçaları yeniden kullanmaMümkün değilAnchor (&ad) ve alias (*ad)
Tek dosyada birden çok belgeHayırEvet, üç tireden oluşan bir satırla ayrılır
Tipik kullanımAPI'ler, veri alışverişi, tarayıcılarYapı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.

Adım adım

  1. Yönü seçDönüştürücünün üstünde YAML > JSON ya da JSON > YAML seç.
  2. Dosyanı yapıştırİçeriği yapıştır ya da dosyayı aç. Örnek, anchor ve merge key içeren bir YAML dosyası gösterir.
  3. Mesajları okuYAML'da bir hata varsa satır ve sütunuyla gösterilir. Notlar, bilinmeyen tag'leri ve atılan yorumları listeler.
  4. Gidiş dönüşü kontrol etSonucu geri çevirip asıl dosyanla karşılaştırmak için Ters çevir'e bas.

Sık sorulan sorular

JSON geçerli bir YAML mı?

Neredeyse her zaman. YAML 1.2, JSON'u kapsayacak şekilde tasarlandı, bu yüzden bir YAML 1.2 ayrıştırıcısı JSON dosyalarını okur. Eski YAML 1.1 ayrıştırıcılarında bazı kaçış dizileri gibi birkaç fark vardır.

YAML, JSON'dan yavaş mı?

YAML'ın kuralları çok olduğu için ayrıştırılması daha fazla iş ister, ama yapılandırma dosyalarında fark hissedilmez. Büyük veri setleri ve API'ler için JSON daha hızlı ve daha basittir.

YAML dosyamda yes yazıyor, program neden true görüyor?

Program, yes, no, on ve off'un boolean olduğu bir YAML 1.1 ayrıştırıcısı kullanıyor. Metin olarak kalması için değeri tırnak içine al.

YAML'ı JSON'a çevirirken yorumları koruyabilir miyim?

Hayır. JSON'da yorum yoktur, bu yüzden yorumlar atılır. Yorumlar önemliyse kaynak olarak YAML dosyasını sakla.

Burada çevirirken dosyalarım yükleniyor mu?

Hayır. Dönüştürme tamamen tarayıcında yapılır; bu, şifre ya da anahtar içeren yapılandırma dosyaları için önemlidir.