Konvertálás JSON és YAML között

JSON-t YAML-be (és fordítva) konvertál a struktúra megőrzésével, konfigurálható behúzással. Praktikus konfiguráció migrálásához .json és .yaml fájlok között

Mire jó ez a JSON / YAML konvertáló?

Ez az eszköz egy YAML dokumentumot JSON-ná alakít át és fordítva, megőrizve az adatszerkezetet (objektumok, tömbök, skalár típusok). A JSON-ból YAML-be, vagy a YAML-ből JSON-ba történő konvertálás gyakori művelet a fejlesztés során: OpenAPI YAML fájlt generálunk egy JSON specifikációból, egy REST API kimenetét YAML-be konvertáljuk, hogy beküldjük egy konfigurációs tárolóba, egy Kubernetes YAML manifesztet JSON-ba fordítunk, hogy átadjuk a kubectl --dry-run=client -o json parancsnak, vagy egy GitHub Actions munkafolyamatot igazítunk egy JSON sémához. Tágabb értelemben ez a híd az adatcsere világa (JSON) és a kézzel szerkeszthető konfiguráció világa (YAML) között.

YAML vs JSON: közvetlen összehasonlítás

A JSON és a YAML hasonló igényeket szolgál ki, de eltérő felhasználási esetekben. Az alábbi táblázat összefoglalja a főbb technikai különbségeket, amelyek segítenek a kettő közötti választásban a kontextustól függően.

Szempont JSON YAML
Emberi olvashatóság Közepes (kapcsos zárójelek, idézőjelek mindenhol) Erős (behúzás, kevés írásjel)
Bőbeszédűség Bőbeszédűbb Tömörebb
Megjegyzések Nem támogatott Támogatott (# megjegyzés)
Több dokumentum egyetlen fájlban Nem Igen, a --- elválasztóval
Horgonyok és álnevek (újrafelhasználás) Nem Igen (&anchor és *anchor)
Típusrendszer Szigorú (string, number, bool, null, array, object) Implicit kényszerítés (yes, no, null, dátumok, értelmezett skalárok)
Értelmezési teljesítmény Nagyon gyors, natív elemzők mindenhol Lassabb, sokkal szélesebb nyelvtan
Elfogadás REST API-khoz De facto szabvány Ritka
Elfogadás konfigurációhoz Ritka (kivéve package.json, tsconfig.json) De facto szabvány (Kubernetes, CI/CD, Ansible)

Mikor használjunk JSON-t?

A JSON-t akkor kell használni, amikor egy program egy másik programmal beszél. Tipikus felhasználási esetei:

  • REST és GraphQL API-k: kérés és válasz payloadok.
  • Adatcsere mikroszolgáltatások és üzenetsorok között.
  • Natív JavaScript kód: JSON.parse és JSON.stringify függőség nélkül.
  • Böngészőoldali tárolás: localStorage, sessionStorage, IndexedDB.
  • AJAX és fetch kérések.
  • Bináris vagy folyamorientált változatok: BSON (MongoDB), JSON Lines (naplók, ML adatkészletek), MessagePack.
  • JS / TS eszközök konfigurációja: package.json, tsconfig.json, composer.json.

Mikor használjunk YAML-t?

A YAML-t akkor kell használni, ha egy ember rendszeresen szerkeszti a fájlt. Tipikus felhasználási esetei:

  • Docker Compose (docker-compose.yml) és stack profilok.
  • Kubernetes manifesztek (Deployment, Service, Ingress, Helm chartok).
  • Ansible playbookok és leltárak.
  • CI/CD csővezetékek: GitHub Actions, GitLab CI, CircleCI, Bitbucket Pipelines.
  • OpenAPI / Swagger és AsyncAPI specifikációk.
  • Annotált alkalmazáskonfiguráció (Symfony, Spring Boot, Rails), ahol a megjegyzések hasznosak.
  • Gyakran kézzel szerkesztett fájlok, ahol a tömörség és az olvashatóság fontosabb az elemzési sebességnél.

Gyakori csapdák a YAML-ben

A YAML megengedőbb, mint a JSON, ami erőteljes, de csalóka formátummá teszi. A leggyakoribb csapdák:

  • Behúzás: a tabulátorokat a specifikáció tiltja, csak a szóközök érvényesek. A kettő keverése vagy a szóközök számának megváltoztatása ugyanazon a blokkon belül megszakítja az elemzést.
  • Skalárok automatikus kényszerítése: yes, no, on, off, true, false, null, None, ~ logikai értékként vagy nullként kerülnek elemzésre. Példa csapda: egy idézőjel nélküli 01234 irányítószám az 1234 egésszé válik, és egy NO országkód (Norvégia) false lesz. Az ambiguus karakterláncokat mindig tegye idézőjelbe.
  • Többsoros karakterláncok: a | (blokk literál) megőrzi a sortöréseket úgy, ahogy vannak, míg a > (összehajtott) a sortöréseket szóközökre cseréli. A - és + chomping indikátorok az utolsó sortörés viselkedését állítják be.
  • YAML 1.1 vs 1.2: az 1.1 (még mindig elterjedt, például alapértelmezés szerint a PyYAML-en keresztül) a yes/no/on/off-ot logikai értékként kezeli, amit az 1.2 eltávolított. A viselkedés a 8-as alapú számoknál is eltér.
  • Implicit dátumok: a 2024-01-15 idézőjelek nélkül egyes elemzők dátum objektumként értelmezik, nem karakterláncként.

Példák egymás mellett

Ugyanaz a dokumentum JSON-ban, majd YAML-ben kifejezve. Egy alkalmazás egyszerű konfigurációja függőségeivel és környezetével:

JSON verzió

{
    "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
}

Egyenértékű YAML verzió

# Az alkalmazás konfigurációja
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

A YAML verzió körülbelül 25%-kal rövidebb karakterben, elfogad egy megjegyzést az elején, és úgy olvasható, mint a tulajdonságok listája szintaktikai zaj nélkül.

Hogyan használjuk a konvertálót

Az adatok konvertálásának lépései:

  1. Illessze be a forrásdokumentumot (JSON vagy YAML) a beviteli mezőbe.
  2. Válassza ki a kívánt konverziós irányt (JSON-ból YAML-be, vagy YAML-ből JSON-ba).
  3. Kattintson a konvertálás gombra: a formázott eredmény megjelenik a kimeneti területen.
  4. Ellenőrizze az eredményt, majd a másolás gombbal másolja az eredményt a vágólapra.

A konvertálás helyben történik a böngészőben vagy egy dedikált szerverútvonalon keresztül az eszközkészlettől függően: nem tárolunk érzékeny adatokat.

Gyakran ismételt kérdések

JSON-t vagy YAML-t használjak a konfigurációs fájljaimhoz?

Ha az ökoszisztéma megkövetel egy formátumot (Kubernetes YAML-t, package.json JSON-t), kövesse a konvenciót. Egyébként válassza a YAML-t a hosszú és annotált konfigurációkhoz, amelyeket kézzel szerkeszt, és a JSON-t a program által generált vagy kód által fogyasztott konfigurációkhoz. A hasznos megjegyzések jelenléte gyakran a döntő érv a YAML mellett.

Hogyan tarthatom meg a megjegyzéseket egy YAML -> JSON -> YAML körút során?

Nem tudja. A JSON nem támogatja a megjegyzéseket: amint a YAML-t JSON-ra konvertálja, a megjegyzések véglegesen elvesznek. A megjegyzések megőrzéséhez a programozott szerkesztés során használjon olyan elemzőt, amely megőrzi a formázást, például a Python ruamel.yaml könyvtárát körút módban, vagy kerülje el teljesen a JSON-on való áthaladást.

Miért elemződik megfelelően a YAML fájlom helyben, de bukik el élesben?

Gyakori okok: eltérő elemző verziók (YAML 1.1 vs 1.2), egy szerkesztő által bevezetett tabulátorok, idézőjel nélküli értékek, amelyek logikai értéknek (NO, off) vagy számnak (01234) tűnnek, fájlkódolás (rosszul kezelt UTF-8 BOM). Mindig tegye idézőjelbe az ambiguus karakterláncokat, és rögzítse az elemző verzióját a projektben.

A JSON a YAML részhalmaza?

A YAML 1.2 óta a gyakorlatban igen: minden érvényes JSON dokumentum egyben érvényes YAML 1.2 dokumentum is. Fordítva nem igaz: egy olyan YAML dokumentum, amely megjegyzéseket, horgonyokat, implicit dátumokat vagy több dokumentumot tartalmaz egy fájlban, nem fejezhető ki közvetlenül JSON-ban információvesztés nélkül.

Milyen alternatívákat érdemes ismerni a JSON és a YAML mellett?

TOML: népszerű konfigurációhoz (Cargo, pyproject.toml), jó kompromisszum az olvashatóság és az explicit gépelés között. INI: nagyon egyszerű, de nincs szabványos beágyazott szerkezete. XML: bőbeszédű, de továbbra is releváns a SOAP-hoz és bizonyos legacy Java konfigurációkhoz. HCL: a Terraform használja. JSON5 és JSONC: a JSON kiterjesztései, amelyek lehetővé teszik a megjegyzéseket és a záró vesszőket.

Mennyi a YAML súlya a JSON-hoz képest?

Egyenértékű szerkezet esetén a YAML általában 15-30%-kal rövidebb bájtokban, köszönhetően a kulcsok és a legtöbb karakterlánc körüli idézőjelek hiányának, valamint a kapcsos zárójelek hiányának. A hálózaton (HTTP átvitel) a minifikált JSON hasonló marad, de a YAML kompaktabb marad az olvasható verzióban. A tiszta elemzési teljesítmény érdekében a JSON többszörösen gyorsabb, ami igazolja használatát a nagy forgalmú API-khoz.

Kérés példa

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

Bemeneti séma

Mező Típus Kötelező Alapértelmezett
json text
space_tabulation integer

Végpontok

  • GET https://cdrn.fr/api/v1/tools - listázza az összes elérhető eszközt
  • GET https://cdrn.fr/api/v1/tools/json-yaml-converter - lekéri ezen eszköz sémáját
  • POST https://cdrn.fr/api/v1/tools/json-yaml-converter/execute - végrehajtja ezen eszközt JSON payloaddal