YAML,
YAML Ain’t Markup Language, hem insan tarafından kolaylıkla okunabilen hemde sayısal olarak kolaylıkla işleme alınabilen ve tüm programlama dilleri tarafından kullanılabilen bir veri değişim formatıdır. Temel amacı oldukça kompleks bir yapı sunan
XML‘e basitleştirilmiş bir alternatif sunabilmek olan
YAML ile ilgili gelişmeler ve desteklenen programlama dilleriyle ilgili
yaml.org adresi takip edilebilir. Bu özellikleri bir liste haline getirecek olursak;
- Kolay okunabilir,
- Farklı programlama dilleri arasında veri taşıma amacıyla ortak bir şekilde kullanılabilir,
- Tutarlı bir modele sahiptir,
- Esnek ve geliştirilebilir bir yapı sunar,
- Uygulaması, entegre etmesi ve kullanması kolaydır.
Daha fazla bilgi ve detaylı bir değerlendirme için
Martin Tournoij tarafından paylaşılan
YAML: probably not so great after all başlıklı yazıya ve
Reddit tartışmasına göz atmanızı öneririm. Tüm diller tarafından ortak bir şekilde kullanılabilen yapısı sayesinde nesne yapılarının temsilinin yanı sıra konfigürasyon amaçlı da kullanılmaktadır.
JSON Nedir? başlıklı yazıda
JSON ve
XML yapılarına değinmiştim. Aynı
XML örneğini
YAML ile oluşturulmuş şekilde aşağıda ayrıca iletiyorum.
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<name>Charles</name>
<surname>Freck</surname>
<age>31</age>
<address>
<city>Anaheim</city>
<county>Orange County</county>
<state>California</state>
<coordinates>
<ID>
<row>33</row>
<row>50</row>
<row>7.0548</row>
<row>N</row>
</ID>
<ID>
<row>117</row>
<row>54</row>
<row>52.218</row>
<row>W</row>
</ID>
</coordinates>
</address>
<contact>
<type>telephone</type>
<number>25052006</number>
</contact>
<contact>
<type>e-mail</type>
<name>ascanner@darkly.com</name>
</contact>
<contact>
<type>
<account>facebook</account>
<url>https://facebook.com/charles.freck</url>
<official>0</official>
</type>
<type>
<account>twitter</account>
<url>https://twitter.com/charles.freck</url>
<official>1</official>
</type>
<type>
<account>instagram</account>
<url>https://instagram.com/charles.freck</url>
<official>0</official>
</type>
<type>
<account>linkedin</account>
<url/>
<official/>
</type>
</contact>
</root> |
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<name>Charles</name>
<surname>Freck</surname>
<age>31</age>
<address>
<city>Anaheim</city>
<county>Orange County</county>
<state>California</state>
<coordinates>
<ID>
<row>33</row>
<row>50</row>
<row>7.0548</row>
<row>N</row>
</ID>
<ID>
<row>117</row>
<row>54</row>
<row>52.218</row>
<row>W</row>
</ID>
</coordinates>
</address>
<contact>
<type>telephone</type>
<number>25052006</number>
</contact>
<contact>
<type>e-mail</type>
<name>ascanner@darkly.com</name>
</contact>
<contact>
<type>
<account>facebook</account>
<url>https://facebook.com/charles.freck</url>
<official>0</official>
</type>
<type>
<account>twitter</account>
<url>https://twitter.com/charles.freck</url>
<official>1</official>
</type>
<type>
<account>instagram</account>
<url>https://instagram.com/charles.freck</url>
<official>0</official>
</type>
<type>
<account>linkedin</account>
<url/>
<official/>
</type>
</contact>
</root>
XML içeriği okumanın zorluğunu ve katı kuralları sebebiyle esnetilmesindeki güçlüklerden tekrar detaylıca bahsetmeye gerek yok. Aşağıda, bu yapının
JSON formatındaki karşılığına baktığımızda daha kolay okunabildiğini ve esnek bir şekilde kullanılabildiğini görebilmekteyiz.
{
"root": {
"name": "Charles",
"surname": "Freck",
"age": "31",
"address": {
"city": "Anaheim",
"county": "Orange County",
"state": "California",
"coordinates": {
"ID": [
{
"row": [
"33",
"50",
"7.0548",
"N"
]
},
{
"row": [
"117",
"54",
"52.218",
"W"
]
}
]
}
},
"contact": [
{
"type": "telephone",
"number": "25052006"
},
{
"type": "e-mail",
"name": "ascanner@darkly.com"
},
{
"type": [
{
"account": "facebook",
"url": "https://facebook.com/charles.freck",
"official": "0"
},
{
"account": "twitter",
"url": "https://twitter.com/charles.freck",
"official": "1"
},
{
"account": "instagram",
"url": "https://instagram.com/charles.freck",
"official": "0"
},
{
"account": "linkedin",
"url": "",
"official": ""
}
]
}
]
}
} |
{
"root": {
"name": "Charles",
"surname": "Freck",
"age": "31",
"address": {
"city": "Anaheim",
"county": "Orange County",
"state": "California",
"coordinates": {
"ID": [
{
"row": [
"33",
"50",
"7.0548",
"N"
]
},
{
"row": [
"117",
"54",
"52.218",
"W"
]
}
]
}
},
"contact": [
{
"type": "telephone",
"number": "25052006"
},
{
"type": "e-mail",
"name": "ascanner@darkly.com"
},
{
"type": [
{
"account": "facebook",
"url": "https://facebook.com/charles.freck",
"official": "0"
},
{
"account": "twitter",
"url": "https://twitter.com/charles.freck",
"official": "1"
},
{
"account": "instagram",
"url": "https://instagram.com/charles.freck",
"official": "0"
},
{
"account": "linkedin",
"url": "",
"official": ""
}
]
}
]
}
}
JSON ile
YAML karşılaştırmasını yaptığımızda ise ilk dikkatimizi çeken konu JSON formatında sıklıkla yer bulan süslü ve köşeli parantez (
{},
[]) kullanımları olacaktır. Bunun yerine YAML boşlukları, çizgi ve bazı diğer karakterleri kullanır. Yapı (structure) girintiyle (bir veya daha fazla boşluk), sıra öğeleri (sequence) bir çizgi (
–) ve map kapsamındaki anahtar değer (key value) üst üste iki nokta (
:) ile ayrılır; key (anahtar): value (değer). Referans tanımlamalardan bazılarını (YAML 1.1+ için) listeleyecek olursak;
Göstergeler Koleksiyonu:
'? ' : Anahtar (key) gösterge.
': ' : Değer (value) gösterge.
'- ' : İç içe seri giriş göstergesi.
', ' : Ayrı satır içi Separate in-line dal ayrıştırıcı.
'[]' : Satır içi seri kapsayıcı.
'{}' : Satır içi ifade kapsayıcı.
Ad Tanımlama Koleksiyonu:
'&' : Çapa tanımı.
'*' : Takma ad göstergesi. |
Göstergeler Koleksiyonu:
'? ' : Anahtar (key) gösterge.
': ' : Değer (value) gösterge.
'- ' : İç içe seri giriş göstergesi.
', ' : Ayrı satır içi Separate in-line dal ayrıştırıcı.
'[]' : Satır içi seri kapsayıcı.
'{}' : Satır içi ifade kapsayıcı.Ad Tanımlama Koleksiyonu:
'&' : Çapa tanımı.
'*' : Takma ad göstergesi.
Referans gösterge koleksiyonlarının tamamını
yaml.org > Reference card sayfası üzerinden görüntüleyebilir,
How To Write YAML ve
Complete idiot’s introduction to yaml ile yazım konusundaki örnekleri inceleyebilirsiniz.
root:
name: Charles
surname: Freck
age: 31
address:
city: Anaheim
county: "Orange County"
state: California
coordinates:
ID:
-
row:
-
33
-
50
-
"7.0548"
-
N
-
row:
-
117
-
54
-
"52.218"
-
W
contact:
-
type: telephone
number: 25052006
-
type: "e-mail"
name: "ascanner@darkly.com"
-
type:
-
account: facebook
url: "https://facebook.com/charles.freck"
official: 0
-
account: twitter
url: "https://twitter.com/charles.freck"
official: 1
-
account: instagram
url: "https://instagram.com/charles.freck"
official: 0
-
account: linkedin
url: ""
official: "" |
root:
name: Charles
surname: Freck
age: 31
address:
city: Anaheim
county: "Orange County"
state: California
coordinates:
ID:
-
row:
-
33
-
50
-
"7.0548"
-
N
-
row:
-
117
-
54
-
"52.218"
-
W
contact:
-
type: telephone
number: 25052006
-
type: "e-mail"
name: "ascanner@darkly.com"
-
type:
-
account: facebook
url: "https://facebook.com/charles.freck"
official: 0
-
account: twitter
url: "https://twitter.com/charles.freck"
official: 1
-
account: instagram
url: "https://instagram.com/charles.freck"
official: 0
-
account: linkedin
url: ""
official: ""
Hatırlarsanız,
WP-CLI konfigürasyon işlemleri için de
*.yml (YAML) dosyalarına müdahale etmiştik. Benzer şekilde daha pek çok uygulama ve servis bağlamında YAML dosyalarıyla haşır neşir olmaktayız; Docker Compose ve Symfony2 konfigürasyon süreçlerini de örnek olarak gösterebiliriz.