Pretvoriti med JSON in YAML

pretvarja JSON v YAML (in obratno) ob ohranjanju strukture, z nastavljivim zamikom. Praktično za migracijo konfiguracije med datotekami .json in .yaml

Čemu je ta pretvornik JSON / YAML?

To orodje pretvori dokument YAML v JSON in obratno, pri čemer ohrani strukturo podatkov (objekti, tabele, skalarni tipi). Pretvorba JSON v YAML ali YAML v JSON je pogosta operacija v razvoju: ustvarimo datoteko OpenAPI YAML iz specifikacije JSON, pretvorimo izhod API-ja REST v YAML, da ga prenesemo v repozitorij konfiguracije, prevedemo manifest Kubernetes YAML v JSON, da ga posredujemo kubectl --dry-run=client -o json, ali poravnamo Dejanja poteka dela GitHub s shemo JSON. V širšem smislu je most med svetom izmenjave podatkov (JSON) in svetom ročno urejane konfiguracije (YAML).

YAML proti JSON: Primerjava med prvimi

JSON in YAML obravnavata podobne potrebe, vendar različne primere uporabe. Naslednja tabela povzema glavne tehnične razlike, uporabne za izbiro med obema glede na kontekst.

Merilo JSON YAML
Človeška berljivost Povprečje (oklepaji, narekovaji vseskozi) Močna (zamik, majhna ločila)
Natančnost Bolj besedno Bolj jedrnato
Komentarji Ni podprto Podprto (# komentar)
Več dokumentov v eni datoteki Ne Da, prek ločila ---
Sidra in vzdevki (ponovna uporaba) Ne Da (&anchor in *anchor)
Vnesite sistem Strogo (niz, število, bool, nič, niz, predmet) Implicitno prisiljevanje (da, ne, null, datumi, interpretirani skalarji)
Zmogljivost razčlenjevanja Zelo hitri, izvorni razčlenjevalniki povsod Počasnejša, veliko širša slovnica
Prevzem API-jev REST De facto standard Redko
Prevzem za konfiguracijo Redki (razen package.json, tsconfig.json) Dejanski standard (Kubernetes, CI/CD, Ansible)

Kdaj uporabiti JSON?

JSON je potreben vedno, ko se program pogovarja z drugim programom. Njegovi tipični primeri uporabe:

  • API-ji REST in GraphQL: obremenitve zahtev in odgovorov.
  • Izmenjava podatkov med mikro storitvami in čakalnimi vrstami sporočil.
  • Izvorna koda JavaScript: JSON.parse in JSON.stringify brez odvisnosti.
  • Shramba na strani brskalnika: localStorage, sessionStorage, IndexedDB.
  • Zahteve AJAX in fetch.
  • Binarne ali pretočno usmerjene različice: BSON (MongoDB), JSON Lines (dnevniki, nabori podatkov ML), MessagePack.
  • Konfiguracija orodij JS/TS: package.json, tsconfig.json, composer.json.

Kdaj uporabiti YAML?

YAML je potreben takoj, ko oseba redno ureja datoteko. Njegovi tipični primeri uporabe:

  • Docker Compose (docker-compose.yml) in profili zlaganja.
  • Manifesti Kubernetes (razmestitev, storitev, vhod, diagrami Helm).
  • Ansible Playbooks in popisi.
  • Cevi CI/CD: GitHub Actions, GitLab CI, CircleCI, Bitbucket Pipelines.
  • Specifikacije OpenAPI/Swagger in AsyncAPI.
  • Konfiguracija aplikacije z opombami (Symfony, Spring Boot, Rails), kjer so komentarji uporabni.
  • Datoteke, ki se pogosto urejajo ročno, kjer imata jedrnatost in berljivost prednost pred hitrostjo razčlenjevanja.

Pogoste pasti v YAML

YAML je bolj permisiven kot JSON, zaradi česar je močan, a zahrbten format. Najpogostejše pasti:

  • Zamik: specifikacija prepoveduje zavihke, veljavni so le presledki. Mešanje obeh ali spreminjanje števila presledkov v istem bloku prekine razčlenjevanje.
  • Samodejno skalarno prisiljevanje: da, ne, on, off, true, false, null, None, ~ so razčlenjeni kot logične ali ničelne vrednosti. Primer pasti: poštna številka 01234 brez narekovajev postane celo število 1234 in ime države NO (Norveška) postane false. Dvoumne nize vedno postavite v narekovaje.
  • Večvrstični nizi: | (blokovni literal) ohrani prelome vrstic takšne, kot so, medtem ko > (prepognjen) zamenja prelome vrstic s presledki. Zastavici žvečenja - in + prilagodita vedenje pri zadnjem skoku.
  • YAML 1.1 proti 1.2: 1.1 (še vedno zelo pogost, na primer prek PyYAML privzeto) obravnava yes/no/on/off kot logične vrednosti, ki jih je 1.2 odstranil. Vedenja se razlikujejo tudi glede na številke z bazo 8.
  • Implicitni datumi: 2024-01-15 brez narekovajev nekateri razčlenjevalniki razlagajo kot datumski objekt in ne kot niz.

Vzporedni primeri

Isti dokument, izražen v JSON in nato v YAML. Preprosta konfiguracija aplikacije z njenimi odvisnostmi in okoljem:

Različica JSON

{
    "ime": "cdrn-aplikacija",
    "različica": "1.14.2",
    "okolje": "proizvodnja",
    "odvisnosti": {
        "php": "^8.3",
        "symfony/framework-bundle": "^7.0",
        "doctrine/orm": "^3.0"
    },
    "features": ["cache", "mailer", "queue"],
    "debug": napačno
}

Enakovredna različica YAML

# Konfiguracija aplikacije
ime: cdrn-app
različica: 1.14.2
okolje: proizvodnja
odvisnosti:
    php: '^8.3'
    symfony/framework-bundle: '^7.0'
    doktrina/orm: '^3.0'
lastnosti:
    - predpomnilnik
    - poštar
    - rep
debug: false

Različica YAML je približno 25 % krajša v znakih, sprejema vodilni komentar in se bere kot seznam lastnosti brez sintaktičnega šuma.

Kako uporabljati pretvornik

Koraki za pretvorbo podatkov:

  1. Prilepite izvorni dokument (JSON ali YAML) v polje za vnos.
  2. Izberite želeno smer pretvorbe (JSON v YAML ali YAML v JSON).
  3. Kliknite gumb za pretvorbo: oblikovani rezultat se prikaže v izhodnem območju.
  4. Preverite upodabljanje in nato uporabite gumb za kopiranje, da pridobite rezultat v odložišče.

Pretvorba se izvede lokalno v vašem brskalniku ali prek namenske strežniške poti, odvisno od orodja: občutljivi podatki se ne ohranijo.

Pogosta vprašanja

JSON ali YAML za moje konfiguracijske datoteke?

Če ekosistem zahteva obliko (Kubernetes v YAML, package.json v JSON), upoštevajte konvencijo. V nasprotnem primeru dajte prednost YAML za dolge konfiguracije z opombami, ki jih urejate ročno, in JSON za konfiguracije, ki jih ustvari program ali uporabi koda. Prisotnost uporabnih komentarjev je pogosto odločilni argument v prid YAML.

Kako obdržati komentarje med povratnim potovanjem YAML v JSON v YAML?

Ne moreš. JSON ne podpira komentarjev: takoj ko pretvorite YAML v JSON, se komentarji trajno izgubijo. Če želite ohraniti komentarje med programskim urejanjem, uporabite razčlenjevalnik, ki ohranja oblikovanje, kot je ruamel.yaml v Pythonu v povratnem načinu, ali pa se popolnoma izognite uporabi JSON.

Zakaj moja datoteka YAML pravilno razčlenjuje lokalno, vendar ne uspe v produkciji?

Pogosti vzroki: različne različice razčlenjevalnika (YAML 1.1 proti 1.2), zavihki, ki jih je uvedel urejevalnik, vrednosti brez narekovajev, ki so videti kot logične vrednosti (NO, off) ali številke (01234), kodiranje datoteke (UTF-8 BOM je slabo obdelan). Sistematično navajajte dvoumne nize in nastavite različico razčlenjevalnika v svojem projektu.

Ali je JSON podnabor YAML?

Od YAML 1.2, v praksi da: vsak veljaven dokument JSON je veljaven dokument YAML 1.2. Nasprotno je napačno: dokumenta YAML, ki uporablja komentarje, sidra, implicitne datume ali več dokumentov v datoteki, ni mogoče izraziti neposredno v JSON brez izgube informacij.

Katere alternative za JSON in YAML morate poznati?

TOML: priljubljeno za konfiguracijo (Cargo, pyproject.toml), dober kompromis med berljivostjo in eksplicitnim tipkanjem. INI: zelo preprosto, vendar brez standardne ugnezdene strukture. XML: podrobno, vendar še vedno pomembno za SOAP in nekatere podedovane konfiguracije Jave. HCL: uporablja ga Terraform. JSON5 in JSONC: razširitvi JSON, ki omogočata komentarje in vejice na koncu.

Kakšna je teža YAML v primerjavi z JSON?

Za enakovredno strukturo je YAML običajno 15 do 30 % krajši v bajtih, zahvaljujoč odsotnosti narekovajev okoli ključev in večine nizov ter odsotnosti oklepajev. Na žici (prenos HTTP) ostaja minificirani JSON primerljiv, vendar ostaja YAML bolj kompakten v berljivi različici. Za čisto zmogljivost na strani razčlenjevanja je JSON nekajkrat hitrejši, kar upravičuje njegovo uporabo za API-je z velikim prometom.

Primer zahteve

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

Vhodna shema

Polje Tip Obvezno Privzeto
json text
space_tabulation integer

Končne točke

  • GET https://cdrn.fr/api/v1/tools - izpiše vsa razpoložljiva orodja
  • GET https://cdrn.fr/api/v1/tools/json-yaml-converter - pridobi shemo tega orodja
  • POST https://cdrn.fr/api/v1/tools/json-yaml-converter/execute - izvede to orodje s JSON payloadom