Convertirea între JSON și YAML

convertește JSON în YAML (și invers) păstrând structura, cu indentare configurabilă. Practic pentru a migra o configurație între fișiere .json și .yaml

La ce servește acest convertor JSON / YAML?

Acest instrument transformă un document YAML în JSON și invers, păstrând structura datelor (obiecte, tablouri, tipuri scalare). Conversia JSON spre YAML, sau YAML spre JSON, este o operație curentă în dezvoltare: se generează un fișier OpenAPI YAML dintr-o spec JSON, se convertește ieșirea unui API REST în YAML pentru a o commita într-un depozit de configurație, se traduce un manifest Kubernetes YAML în JSON pentru a-l trece la kubectl --dry-run=client -o json, sau se aliniază un workflow GitHub Actions cu o schemă JSON. Mai larg, este puntea între lumea schimbului de date (JSON) și cea a configurației editabile manual (YAML).

YAML vs JSON: comparație directă

JSON și YAML adresează nevoi apropiate dar cazuri de utilizare diferite. Tabelul următor rezumă diferențele tehnice majore, utile pentru a alege între cele două în funcție de context.

Criteriu JSON YAML
Lizibilitate umană Medie (acolade, ghilimele peste tot) Puternică (indentare, puțină punctuație)
Verbositate Mai verbos Mai concis
Comentarii Nesuportate Suportate (# comentariu)
Multi-documente într-un singur fișier Nu Da, prin separatorul ---
Anchors și aliases (reutilizare) Nu Da (&anchor și *anchor)
Sistem de tipuri Strict (string, number, bool, null, array, object) Coerciție implicită (yes, no, null, date, scalare interpretate)
Performanță de parsing Foarte rapidă, parseri nativi peste tot Mai lentă, gramatică mult mai largă
Adopție pentru API REST Standard de facto Rar
Adopție pentru configurație Rar (excepție package.json, tsconfig.json) Standard de facto (Kubernetes, CI/CD, Ansible)

Când să utilizezi JSON?

JSON se impune imediat ce un program vorbește cu un alt program. Cazurile sale de utilizare tipice:

  • API-uri REST și GraphQL: payload-uri de cerere și răspuns.
  • Schimb de date între microservicii și cozi de mesaje.
  • Cod JavaScript nativ: JSON.parse și JSON.stringify fără dependență.
  • Stocare pe partea browserului: localStorage, sessionStorage, IndexedDB.
  • Cereri AJAX și fetch.
  • Variante binare sau orientate pe flux: BSON (MongoDB), JSON Lines (log-uri, dataset-uri ML), MessagePack.
  • Configurare a instrumentelor JS / TS: package.json, tsconfig.json, composer.json.

Când să utilizezi YAML?

YAML se impune imediat ce un om editează regulat fișierul. Cazurile sale de utilizare tipice:

  • Docker Compose (docker-compose.yml) și profiluri de stack.
  • Manifeste Kubernetes (Deployment, Service, Ingress, Helm charts).
  • Playbook-uri Ansible și inventare.
  • Pipeline-uri CI/CD: GitHub Actions, GitLab CI, CircleCI, Bitbucket Pipelines.
  • Specificații OpenAPI / Swagger și AsyncAPI.
  • Configurație aplicativă adnotată (Symfony, Spring Boot, Rails) unde comentariile sunt utile.
  • Fișiere editate frecvent manual, unde concizia și lizibilitatea primează asupra vitezei de parsing.

Capcane curente în YAML

YAML este mai permisiv decât JSON, ceea ce face din el un format puternic dar trădător. Capcanele cele mai frecvente:

  • Indentare: tab-urile sunt interzise de specificație, doar spațiile sunt valide. Amestecul celor două sau schimbarea numărului de spații în același bloc sparge parsing-ul.
  • Coerciție automată a scalarilor: yes, no, on, off, true, false, null, None, ~ sunt parsate ca booleani sau null. Capcană exemplu: un cod poștal 01234 necitat devine întregul 1234, iar un nume de țară NO (Norvegia) devine false. Pune întotdeauna între ghilimele șirurile ambigue.
  • Stringuri multilinie: | (block literal) păstrează salturile de linie ca atare, în timp ce > (folded) înlocuiește salturile de linie cu spații. Indicatorii de chomping - și + ajustează comportamentul pe saltul final.
  • YAML 1.1 vs 1.2: 1.1 (încă foarte răspândit, de exemplu prin PyYAML implicit) tratează yes/no/on/off ca booleani, ceea ce 1.2 a suprimat. Comportamentele diferă și pe numerele în bază 8.
  • Date implicite: 2024-01-15 fără ghilimele este interpretat ca obiect dată de anumiți parseri, nu ca șir.

Exemple alături

Același document, exprimat în JSON apoi în YAML. Configurație simplă a unei aplicații cu dependențele și mediul său:

Versiune 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
}

Versiune YAML echivalentă

# Configurația aplicației
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

Versiunea YAML este mai scurtă cu aproximativ 25% în caractere, acceptă un comentariu în capul listei și se citește ca o listă de proprietăți fără zgomot sintactic.

Cum să utilizezi convertorul

Pași pentru a converti datele tale:

  1. Lipește documentul tău sursă (JSON sau YAML) în câmpul de intrare.
  2. Selectează sensul de conversie dorit (JSON spre YAML, sau YAML spre JSON).
  3. Apasă pe butonul de conversie: rezultatul formatat apare în zona de ieșire.
  4. Verifică randarea, apoi utilizează butonul de copiere pentru a recupera rezultatul în clipboard-ul tău.

Conversia este efectuată local în browserul tău sau printr-o rută server dedicată în funcție de tooling: nicio dată sensibilă nu este păstrată.

Întrebări frecvente

JSON sau YAML pentru fișierele mele de configurare?

Dacă ecosistemul impune un format (Kubernetes în YAML, package.json în JSON), urmează convenția. Altfel, privilegiază YAML pentru configurații lungi și adnotate pe care le editezi manual, și JSON pentru configurațiile generate de un program sau consumate de cod. Prezența comentariilor utile este adesea argumentul decisiv în favoarea YAML.

Cum păstrez comentariile la un round-trip YAML spre JSON spre YAML?

Nu poți. JSON nu suportă comentariile: imediat ce convertești YAML în JSON, comentariile sunt pierdute definitiv. Pentru a păstra comentariile la editări programatice, utilizează un parser care păstrează punerea în formă, precum ruamel.yaml în Python în mod round-trip, sau evită complet trecerea prin JSON.

De ce fișierul meu YAML se parsează corect local dar eșuează în prod?

Cauze frecvente: versiuni de parser diferite (YAML 1.1 vs 1.2), tab-uri introduse de un editor, valori necitate care seamănă cu booleani (NO, off) sau cu numere (01234), codarea fișierului (UTF-8 BOM prost gestionat). Citează sistematic șirurile ambigue și fixează versiunea parser-ului în proiectul tău.

Este JSON un subset al YAML?

Din YAML 1.2, da în practică: orice document JSON valid este un document YAML 1.2 valid. Inversul este fals: un document YAML care utilizează comentarii, anchors, date implicite sau mai multe documente într-un fișier nu poate fi exprimat direct în JSON fără pierdere de informație.

Ce alternative la JSON și YAML să cunosc?

TOML: popular pentru config (Cargo, pyproject.toml), bun compromis lizibilitate și tipizare explicită. INI: foarte simplu, dar fără structură imbricată standard. XML: verbos, dar rămâne pertinent pentru SOAP și anumite configurări Java legacy. HCL: utilizat de Terraform. JSON5 și JSONC: extensii JSON care autorizează comentariile și virgulele de sfârșit.

Care este greutatea YAML vs JSON?

La structură echivalentă, YAML este în general 15 până la 30% mai scurt în octeți, datorită absenței ghilimelelor în jurul cheilor și majorității șirurilor, și absenței acoladelor. Pe wire (transport HTTP), JSON minifiat rămâne comparabil, dar YAML rămâne mai compact în versiune lizibilă. Pentru performanța pură pe partea parsing-ului, JSON este de mai multe ori mai rapid, ceea ce justifică utilizarea sa pentru API-uri cu trafic puternic.

Exemplu de cerere

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

Schema de intrare

Câmp Tip Obligatoriu Implicit
json text
space_tabulation integer

Puncte de acces

  • GET https://cdrn.fr/api/v1/tools - listează toate instrumentele disponibile
  • GET https://cdrn.fr/api/v1/tools/json-yaml-converter - obține schema acestui instrument
  • POST https://cdrn.fr/api/v1/tools/json-yaml-converter/execute - execută acest instrument cu un payload JSON