JSON vs YAML: Który Format Konfiguracji Powinieneś Wybrać?
Szybka odpowiedź
Używaj JSON dla API, wymiany danych i przypadków gdzie ścisłe parsing&validation ma znaczenie. Używaj YAML dla plików konfiguracyjnych, manifestów DevOps i gdzie ludzka czytelność i komentarze są ważne. YAML to superset JSON —każdy poprawny JSON to poprawny YAML.
Wstęp
JSON i YAML to oba ludzko-czytelne formaty serializacji danych. JSON jest ścisły, minimalny i wszechobecny w web API. YAML to superset JSON, który dodaje komentarze, multiline strings, anchors i strukturę opartą na indentacji —co czyni go popularnym dla plików konfiguracyjnych (Docker Compose, Kubernetes, CI/CD).
Krok po kroku
-
Porównaj składnię i czytelność
JSON używa nawiasów klamrowych i cudzysłowów: {"klucz": "wartość"}. YAML używa wcięć i dwukropków: klucz: wartość. YAML jest czystszy w konfiguracji — nie potrzeba cudzysłowów w przypadku ciągów, nie ma przecinków między elementami, nie ma nawiasów klamrowych. JSON jest bardziej wyraźny i mniej podatny na błędy podczas wymiany danych.
-
Porównaj funkcje
YAML obsługuje: komentarze (#), ciągi wielowierszowe (|, >), kotwice (&) i aliasy (*), wiele dokumentów w jednym pliku (---) oraz typy złożone. JSON nie obsługuje żadnego z nich — żadnych komentarzy, żadnych ciągów wielowierszowych, żadnych odniesień. Prostota JSON jest zamierzona: jest to format wymiany danych, a nie język konfiguracji.
-
Porównaj bezpieczeństwo i analizę składniową
Analiza JSON jest szybka i bezpieczna — JSON.parse jest wbudowany w każdy silnik JavaScript. Analiza YAML jest wolniejsza i bardziej złożona — specyfikacja YAML to ponad 80 stron w porównaniu z 2 stronami JSON. YAML stwarza zagrożenia bezpieczeństwa (atak miliarda śmiechu za pośrednictwem kotwic), których JSON nie ma. Zawsze używaj bezpiecznego parsera YAML, który wyłącza kotwice.
-
Porównaj wykorzystanie ekosystemu
JSON: REST APIs, pakiet.json, tsconfig.json, bazy danych NoSQL, aplikacje internetowe. YAML: Docker Compose, manifesty Kubernetes, akcje GitHub, podręczniki Ansible, konfiguracje CI/CD, specyfikacje OpenAPI. JSON dominuje w danych wykonawczych; YAML dominuje w konfiguracji.
-
Zdecyduj na podstawie swojego przypadku użycia
APIs, wymiana danych, NoSQL, stan aplikacji internetowej: JSON. Pliki konfiguracyjne, DevOps, CI/CD, infrastruktura jako kod: YAML. Jeśli ludzie piszą to ręcznie: YAML. Jeśli maszyny je generują i zużywają: __ZACHOWAJ_2__.
Przykłady
Ta sama konfiguracja w JSON i YAML
Wejście: JSON: {"server": {"port": 8080, "host": "localhost"}}
YAML: server:\n port: 8080\n host: localhost
Wyjście: YAML jest o 30% krótszy i obsługuje komentarze. JSON jest bardziej rygorystyczny i można go uniwersalnie analizować.
Typowe problemy
- Błędy wcięć YAML: YAML używa wcięć dla struktury, a pojedyncza niewłaściwa spacja przerywa analizę — użyj edytora z lintingiem YAML i zawsze używaj spacji, nigdy tabulacji.
- Atak miliarda śmiechu YAML: kotwice i aliasy YAML mogą powodować wykładniczą ekspansję, powodując DoS — użyj bezpiecznego parsera YAML, który wyłącza kotwice (np. yaml.safe_load w Pythonie).
- JSON nie ma komentarzy: specyfikacja JSON zabrania komentowania, co utrudnia dodawanie adnotacji do plików konfiguracyjnych — użyj YAML w przypadku konfiguracji edytowanej przez człowieka, JSON w przypadku danych generowanych maszynowo.
- Niespodzianki związane z niejawnym pisaniem w YAML: YAML automatycznie konwertuje tak/nie na wartości logiczne i 1.0 na liczbę zmiennoprzecinkową, co może łamać pola łańcuchowe — jawnie cytować ciągi, aby uniknąć nieoczekiwanego wymuszania typu.
Porady
- Użyj YAML do konfiguracji stworzonej przez człowieka (Docker Compose, Kubernetes, CI/CD) i JSON do wymiany danych generowanych maszynowo (APIs, NoSQL, stan aplikacji).
- Zawsze używaj bezpiecznego parsera YAML, który wyłącza kotwice i aliasy — nigdy nie używaj modułu ładującego YAML ogólnego przeznaczenia na niezaufanych danych wejściowych.
- Konwertując YAML na JSON, spodziewaj się utraty komentarzy, ciągów wielowierszowych i kotwic — JSON jest podzbiorem YAML, a nie odwrotnie w przypadku funkcji.
- Konsekwentnie wcinaj YAML za pomocą 2 spacji — mieszanie tabulatorów i spacji lub stosowanie niespójnych wcięć to najczęstszy błąd analizy YAML.