Konwertuj między JSON i YAML

konwertuje JSON na YAML (i odwrotnie) z zachowaniem struktury, z konfigurowalnym wcięciem. Przydatne do migracji konfiguracji między plikami .json a .yaml

Do czego służy ten konwerter JSON / YAML?

To narzędzie przekształca dokument YAML w JSON i odwrotnie, zachowując strukturę danych (obiekty, tablice, typy skalarne). Konwersja JSON na YAML lub YAML na JSON to częsta operacja w programowaniu: generuje się plik OpenAPI YAML ze specyfikacji JSON, konwertuje wyjście API REST na YAML, aby zacommitować je w repozytorium konfiguracji, tłumaczy manifest Kubernetes YAML na JSON, aby przekazać go do kubectl --dry-run=client -o json, lub wyrównuje workflow GitHub Actions ze schematem JSON. Szerzej, to most między światem wymiany danych (JSON) a światem ręcznie edytowanej konfiguracji (YAML).

YAML vs JSON: bezpośrednie porównanie

JSON i YAML adresują podobne potrzeby, ale różne przypadki użycia. Poniższa tabela podsumowuje główne różnice techniczne, przydatne do wyboru między nimi w zależności od kontekstu.

Kryterium JSON YAML
Czytelność dla człowieka Średnia (nawiasy klamrowe, cudzysłowy wszędzie) Wysoka (wcięcie, mało interpunkcji)
Gadatliwość Bardziej gadatliwy Bardziej zwięzły
Komentarze Nieobsługiwane Obsługiwane (# commentaire)
Wiele dokumentów w jednym pliku Nie Tak, przez separator ---
Anchory i aliasy (ponowne użycie) Nie Tak (&anchor i *anchor)
System typów Ścisły (string, number, bool, null, array, object) Implicytna koercja (yes, no, null, daty, interpretowane skalary)
Wydajność parsowania Bardzo szybka, natywne parsery wszędzie Wolniejsza, znacznie szersza gramatyka
Adopcja dla API REST Standard de facto Rzadko
Adopcja dla konfiguracji Rzadko (poza package.json, tsconfig.json) Standard de facto (Kubernetes, CI/CD, Ansible)

Kiedy używać JSON?

JSON nadaje się, gdy program komunikuje się z innym programem. Jego typowe przypadki użycia:

  • API REST i GraphQL: payloady żądań i odpowiedzi.
  • Wymiana danych między mikroserwisami i kolejkami wiadomości.
  • Natywny kod JavaScript: JSON.parse i JSON.stringify bez zależności.
  • Przechowywanie po stronie przeglądarki: localStorage, sessionStorage, IndexedDB.
  • Żądania AJAX i fetch.
  • Warianty binarne lub strumieniowe: BSON (MongoDB), JSON Lines (logi, datasety ML), MessagePack.
  • Konfiguracja narzędzi JS / TS: package.json, tsconfig.json, composer.json.

Kiedy używać YAML?

YAML nadaje się, gdy człowiek regularnie edytuje plik. Jego typowe przypadki użycia:

  • Docker Compose (docker-compose.yml) i profile stacków.
  • Manifesty Kubernetes (Deployment, Service, Ingress, Helm charts).
  • Playbooki Ansible i inwentarze.
  • Pipeliny CI/CD: GitHub Actions, GitLab CI, CircleCI, Bitbucket Pipelines.
  • Specyfikacje OpenAPI / Swagger i AsyncAPI.
  • Konfiguracja aplikacyjna z adnotacjami (Symfony, Spring Boot, Rails), gdzie komentarze są przydatne.
  • Pliki edytowane często ręcznie, gdzie zwięzłość i czytelność mają pierwszeństwo nad szybkością parsowania.

Częste pułapki w YAML

YAML jest bardziej permisywny niż JSON, co czyni go potężnym, ale podstępnym formatem. Najczęstsze pułapki:

  • Wcięcie: tabulacje są zabronione przez specyfikację, tylko spacje są prawidłowe. Mieszanie obu lub zmiana liczby spacji w tym samym bloku psuje parsowanie.
  • Automatyczna koercja skalarów: yes, no, on, off, true, false, null, None, ~ są parsowane jako booleany lub null. Przykład pułapki: kod pocztowy 01234 bez cudzysłowów staje się liczbą całkowitą 1234, a nazwa kraju NO (Norwegia) staje się false. Zawsze umieszczaj w cudzysłowach niejednoznaczne ciągi.
  • Stringi wielolinijkowe: | (block literal) zachowuje znaki nowej linii bez zmian, podczas gdy > (folded) zastępuje znaki nowej linii spacjami. Wskaźniki chomping - i + dostosowują zachowanie ostatniego znaku nowej linii.
  • YAML 1.1 vs 1.2: 1.1 (wciąż bardzo rozpowszechniona, na przykład przez PyYAML domyślnie) traktuje yes/no/on/off jako booleany, co 1.2 usunęła. Zachowania różnią się też dla liczb w systemie ósemkowym.
  • Implicytne daty: 2024-01-15 bez cudzysłowów jest interpretowane jako obiekt daty przez niektóre parsery, a nie jako ciąg.

Przykłady obok siebie

Ten sam dokument wyrażony w JSON, a następnie w YAML. Prosta konfiguracja aplikacji z jej zależnościami i środowiskiem:

Wersja JSON

{
    "name": "cdrn-app",
    "version": "1.14.2",
    "environment": "production",
    "dependencies": {
        "php": "^8.3",
        "symfony/framework-bundle": "^7.0",
        "doctrine/orm": "^3.0"
    },
    "features": ["cache", "mailer", "queue"],
    "debug": false
}

Równoważna wersja YAML

# Configuration de l'application
name: cdrn-app
version: 1.14.2
environment: production
dependencies:
    php: '^8.3'
    symfony/framework-bundle: '^7.0'
    doctrine/orm: '^3.0'
features:
    - cache
    - mailer
    - queue
debug: false

Wersja YAML jest o około 25% krótsza w znakach, akceptuje komentarz na początku i czyta się jak listę właściwości bez składniowego szumu.

Jak korzystać z konwertera

Kroki do konwersji twoich danych:

  1. Wklej swój dokument źródłowy (JSON lub YAML) w polu wprowadzania.
  2. Wybierz pożądany kierunek konwersji (JSON na YAML lub YAML na JSON).
  3. Kliknij przycisk konwersji: sformatowany wynik pojawia się w obszarze wyjścia.
  4. Sprawdź rendering, a następnie użyj przycisku kopiowania, aby przenieść wynik do schowka.

Konwersja jest wykonywana lokalnie w twojej przeglądarce lub przez dedykowaną trasę serwera, w zależności od tooling: żadne wrażliwe dane nie są przechowywane.

Najczęściej zadawane pytania

JSON czy YAML dla moich plików konfiguracyjnych?

Jeśli ekosystem narzuca format (Kubernetes w YAML, package.json w JSON), podążaj za konwencją. W przeciwnym razie preferuj YAML dla długich i opatrzonych adnotacjami konfiguracji, które edytujesz ręcznie, a JSON dla konfiguracji generowanych przez program lub konsumowanych przez kod. Obecność użytecznych komentarzy jest często rozstrzygającym argumentem na rzecz YAML.

Jak zachować komentarze podczas round-trip YAML na JSON na YAML?

Nie można. JSON nie obsługuje komentarzy: gdy konwertujemy YAML na JSON, komentarze są tracone definitywnie. Aby zachować komentarze podczas edycji programistycznych, użyj parsera, który zachowuje formatowanie, takiego jak ruamel.yaml w Pythonie w trybie round-trip, lub całkowicie unikaj przechodzenia przez JSON.

Dlaczego mój plik YAML parsuje się poprawnie lokalnie, ale zawodzi w produkcji?

Częste przyczyny: różne wersje parsera (YAML 1.1 vs 1.2), tabulacje wprowadzone przez edytor, wartości bez cudzysłowów, które przypominają booleany (NO, off) lub liczby (01234), kodowanie pliku (źle obsłużony UTF-8 BOM). Systematycznie umieszczaj w cudzysłowach niejednoznaczne ciągi i ustal wersję parsera w swoim projekcie.

Czy JSON jest podzbiorem YAML?

Od YAML 1.2 tak w praktyce: każdy prawidłowy dokument JSON jest prawidłowym dokumentem YAML 1.2. Odwrotność jest fałszywa: dokument YAML, który używa komentarzy, anchorów, implicytnych dat lub kilku dokumentów w pliku, nie może być bezpośrednio wyrażony w JSON bez utraty informacji.

Jakie alternatywy dla JSON i YAML warto znać?

TOML: popularny do konfiguracji (Cargo, pyproject.toml), dobry kompromis czytelność i jawne typowanie. INI: bardzo proste, ale brak standardowej zagnieżdżonej struktury. XML: gadatliwy, ale wciąż istotny dla SOAP i niektórych konfiguracji Java legacy. HCL: używany przez Terraform. JSON5 i JSONC: rozszerzenia JSON pozwalające na komentarze i przecinki końcowe.

Jaka jest waga YAML vs JSON?

Przy równoważnej strukturze YAML jest zazwyczaj 15 do 30% krótszy w bajtach, dzięki brakowi cudzysłowów wokół kluczy i większości ciągów oraz brakowi nawiasów klamrowych. Na drucie (transport HTTP) zminifikowany JSON pozostaje porównywalny, ale YAML pozostaje bardziej zwarty w czytelnej wersji. Dla czystej wydajności po stronie parsowania JSON jest kilkukrotnie szybszy, co uzasadnia jego użycie dla API o dużym ruchu.

Przykładowe zapytanie

curl -X POST https://cdrn.fr/api/v1/tools/json-yaml-converter/execute \
  -H "Content-Type: application/json" \
  -d '{"json":"...","space_tabulation":1}'

Schemat wejściowy

Pole Typ Wymagane Domyślnie
json text
space_tabulation integer

Punkty końcowe

  • GET https://cdrn.fr/api/v1/tools - lista wszystkich dostępnych narzędzi
  • GET https://cdrn.fr/api/v1/tools/json-yaml-converter - zwraca schemat dla tego narzędzia
  • POST https://cdrn.fr/api/v1/tools/json-yaml-converter/execute - uruchamia to narzędzie z payloadem JSON