Wprowadzenie do YAML dla początkujących

Programiści tworzący interfejsy API z pewnością zetknęli się z YAML, nawet jeśli ich głównym narzędziem do serializacji jest JSON.

YAML to język o przyjaznej składni, który warto mieć w swoim zestawie narzędzi programistycznych.

Zapoznajmy się z fundamentami YAML.

Serializacja danych

Gdy zachodzi potrzeba przesłania struktury danych lub obiektu przez sieć, taką jak Internet, konieczne jest przekształcenie ich do określonego formatu, umożliwiającego odczyt i zapis. Ten proces, znany jako serializacja, odgrywa kluczową rolę w komunikacji sieciowej. Typowym przykładem jest pobieranie danych z baz danych i przesyłanie ich w sieci.

Do popularnych formatów serializacji zaliczamy między innymi JSON, YAML i XML.

Ten artykuł skupia się na YAML. Po jego przeczytaniu zdobędziesz solidne podstawy do pracy z tym formatem.

Czym jest YAML i jakie korzyści oferuje?

YAML to format serializacji danych, co oznacza, że nie jest językiem znaczników.

Główną zaletą YAML jest jego czytelność i łatwość zapisu. Jeśli potrzebujesz pliku konfiguracyjnego, który będzie zrozumiały dla człowieka, YAML jest idealnym wyborem. Nie jest on całkowitym zamiennikiem JSON, ponieważ każdy z tych formatów ma swoje zastosowania. Niemniej jednak, warto nauczyć się YAML.

Kolejną zaletą YAML jest obsługa różnorodnych typów danych, takich jak wartości logiczne, tablice, słowniki, listy oraz wartości skalarne. Ponadto, YAML jest dobrze wspierany przez popularne języki programowania jak JavaScript, Python, Ruby czy Java.

YAML bazuje na spacji, jest wrażliwy na wielkość liter i spacje. Tabulatory nie są powszechnie akceptowane. Pliki YAML mają rozszerzenie .yaml.

Podstawowa składnia YAML

Każdy plik YAML zaczyna się od `—`, co sygnalizuje początek dokumentu YAML.

Podczas tworzenia API, szczególnie przydatną funkcją YAML jest mapowanie.

Poniżej znajduje się przykład mapowania w YAML:

---
name: James
boy: yes
GPA: 3.41

Składnia mapowania to `klucz: wartość`. Zwróć szczególną uwagę na spację po dwukropku, jest to kluczowe w YAML, w odróżnieniu od JSON lub XML.

YAML obsługuje również różne typy danych, takie jak znaki, ciągi, liczby całkowite, liczby zmiennoprzecinkowe oraz kolekcje, w tym tablice i listy, zbudowane z podstawowych typów danych.

Typy danych w YAML

Spójrzmy na poniższy przykład YAML:

---

MALE: FALSE

GPA: 3.61

ISSUES: NULL

NAME: “BIGYAN”

AGE: 16

Pierwszy typ danych to wartość logiczna, która może przyjmować wartości prawda lub fałsz. `GPA` jest liczbą zmiennoprzecinkową. YAML obsługuje również wartość `null`, tak jak w przypadku `ISSUES`. Wartość `NAME` jest ciągiem znaków, który należy ująć w cudzysłów (podwójny lub pojedynczy). YAML umożliwia także zapis ciągów wielowierszowych, zarówno jako jeden ciąg, jak i z zachowaniem struktury wierszy dla lepszej czytelności.

Ciągi wielowierszowe i jednowierszowe

---

About: >

 Hello this is Ryan

 From Alabama and I like to

 Play soccer.

Symbol `>` pozwala na zapisanie pojedynczego ciągu znaków w wielu wierszach. Chociaż ciąg jest rozłożony na kilka wierszy, jest on traktowany jako jednowierszowy.

Możemy też zachować strukturę wielowierszową za pomocą symbolu `|`:

About: |

 This is a multiline string

 And will be printed line wise.

Listy

Listy są ważnym elementem YAML.

Oto przykład listy:

---

- apple

- banana

- mango

Poniżej przykład mapowania ze skalara na listę, co jest często spotykane w plikach konfiguracyjnych:

---

Fruits:

 Apples

 Banana

 Guava 

Zagnieżdżanie jest konieczne do mapowania skalara na listę. Możemy również tworzyć zagnieżdżone listy, jak w poniższym przykładzie:

Automobiles:

 Car:

     Hyundai

     Volkswagen

     Ford

Tutaj `samochody` zawierają kategorię `Car`, a marki `Hyundai`, `Volkswagen` i `Ford` są zagnieżdżone w `Car`. To przykład wielokrotnego zagnieżdżania. Poziom zagnieżdżenia nie jest ograniczony.

Subjects:

     Engineering:

       Mechanical engineering:

         Design and manufacture

         Automobile

         Control and Design

       Civil engineering:

         Structural engineering

         Hydropower

       Arts:

         Medieval

         Modern

         Painting

YAML udostępnia również symbole `&` i `*` do tworzenia kotwic i odwołań do nich, co pozwala uniknąć duplikowania treści. Jest to szczególnie przydatne w plikach konfiguracyjnych w frameworkach takich jak Ruby on Rails, gdzie pomaga zmniejszyć rozmiar pliku YAML.

Spójrz na przykład poniżej:

details: &details
    name: "John"
    age: 18
profession: engineer

<< : * details

Powyższe jest równoważne z:

profession: engineer

name: "John"

age: 18

YAML w Pythonie

Python oferuje wsparcie dla YAML poprzez moduły takie jak `ruamel` i `pyyaml`. Zacznij od zainstalowania `pyyaml`:

pip zainstaluj pyyaml

Na potrzeby tego samouczka, utwórz plik `details.yaml` o następującej zawartości:

name: "john"

age:18

gender: male

Utwórz też plik `feed.yaml`:

sports:

 football
 basketball
 cricket
 baseball

---
countries:
 Brazil
 Lithuania
 Australia
 USA

Rozpocznijmy od odczytu pliku `details.yaml`:

import yaml

with open('details.yaml') as f:
    
    data = yaml.load(f, Loader=yaml.FullLoader)
    print(data)

Po uruchomieniu pliku `details.py` uzyskamy taki wynik:

 $ python details.py
{'name': "john", 'age': 18, 'gender': male}
import yaml

with open(r'feed.yaml') as file:
    # Parametr FullLoader obsługuje konwersję wartości skalarnych YAML na format słownika Pythona
    fruits_list = yaml.load(file, Loader=yaml.FullLoader)

    print(fruits_list)

Zapisywanie YAML w Pythonie

import yaml

dict_file = [{'sports' : ['hockey', 'rugby', 'tennis', 'ping pong', 'football', 'badminton']},
{'countries' : ['Jamaica', 'England', 'Nepal', 'Netherlands', 'South Africa', 'Bolivia', 'Portugal']}]

with open(r'E:data.yaml', 'w') as file: #tworzymy nowy plik yaml 
    data = yaml.dump(dict_file, file)

Implementacja YAML w Node.js

Node.js jest środowiskiem po stronie serwera, a serializacja danych odgrywa istotną rolę w procesie tworzenia aplikacji.

Rozważmy przykładowy plik `example.yaml`:

name:John

age:18

Hobbies:

 Hobby1:Football

 Hobby2:BasketBall

 Hobby3:Hockey

Job:

-System administrator

-Programmer

Do Node.js dostępna jest biblioteka npm o nazwie js-yaml. Zacznijmy od instalacji modułu:

npm install js-yaml

Teraz możemy użyć modułu `js-yaml` w naszym kodzie:

const yaml = require('js-yaml'); //inicjalizacja js-yaml
const fs   = require('fs'); //inicjalizacja filestream

try {
  const result = yaml.load(fs.readFileSync('example.yml', 'utf8'));
  console.log(result);
} catch (e) {
  console.log(e); //obsługa wyjątków
}

Podsumowanie

W nowoczesnych frameworkach i aplikacjach, gdzie dane są przechowywane i przesyłane, YAML staje się coraz popularniejszy, szczególnie w plikach konfiguracyjnych. YAML jest używany w wielu tych samych sytuacjach co Extensible Markup Language (XML), ale cechuje się uproszczoną składnią, która różni się od XML.

Pliki YAML można tworzyć dla prostych struktur danych przy użyciu poleceń drukowania, które zapisują zarówno dane, jak i odpowiednie formatowanie YAML. Niemniej jednak, dedykowany emiter YAML jest preferowany do zapisu złożonych danych hierarchicznych. Podobnie, w przypadku prostych plików YAML (np. pary klucz-wartość) łatwo jest przeprowadzić analizę z użyciem wyrażeń regularnych.


newsblog.pl