Konvertēt starp JSON un YAML

pārvērš JSON uz YAML (un otrādi), saglabājot struktūru, ar konfigurējamu atkāpi. Praktiski konfigurācijas migrēšanai starp .json un .yaml failiem

Kam paredzēts šis JSON/YAML pārveidotājs?

Šis rīks pārveido YAML dokumentu par JSON un otrādi, saglabājot datu struktūru (objektus, tabulas, skalārus tipus). JSON konvertēšana uz YAML vai YAML uz JSON ir izplatīta darbība izstrādes procesā: mēs ģenerējam OpenAPI YAML failu no JSON specifikācijas, mēs pārveidojam REST API izvadi par YAML, lai to ievietotu konfigurācijas krātuvē, mēs tulkojam Kubernetes YAML manifestu JSON formātā, lai to nodotu kubectl --clientalign. GitHub darbplūsmas darbības ar JSON shēmu. Plašāk runājot, tas ir tilts starp datu apmaiņas pasauli (JSON) un manuāli rediģējamu konfigurāciju (YAML).

YAML vs JSON: savstarpējs salīdzinājums

JSON un YAML risina līdzīgas vajadzības, taču atšķiras lietošanas gadījumi. Nākamajā tabulā ir apkopotas galvenās tehniskās atšķirības, kas ir noderīgas, izvēloties vienu no tām atkarībā no konteksta.

Kritērijs JSON YAML
Cilvēka lasāmība Vidējs (iekavās, pēdiņās visā) Spēcīga (atkāpe, maz pieturzīmju)
Detalizētība Pārrunīgāks Konspektīvāk
Komentāri Netiek atbalstīts Atbalsts (# komentārs)
Vairāki dokumenti vienā failā Jā, izmantojot atdalītāju ---
Enkuri un aizstājvārdi (atkārtota izmantošana) Jā (&anchor un *enkurs)
Tips sistēma Stingri (virkne, numurs, būtība, null, masīvs, objekts) Netieša piespiešana (, , nulle, datumi, interpretētie skalāri)
Parsēšanas veiktspēja Ļoti ātri, vietējie parsētāji visur Lēnāka, daudz plašāka gramatika
Pieņemšana REST API De facto standarts Reti
Pieņemšana konfigurācijai Reti (izņemot package.json, tsconfig.json) De facto standarts (Kubernetes, CI/CD, Ansible)

Kad lietot JSON?

JSON ir nepieciešams ikreiz, kad programma sazinās ar citu programmu. Tās tipiskie lietošanas gadījumi:

  • REST un GraphQL API: pieprasījumu un atbilžu lietderīgās slodzes.
  • Datu apmaiņa starp mikropakalpojumiem un ziņojumu rindām.
  • Vietējais JavaScript kods: JSON.parse un JSON.stringify bez atkarībām.
  • Pārlūkprogrammas krātuve: localStorage, sessionStorage, IndexedDB.
  • AJAX un ieneses pieprasījumi.
  • Bināri vai uz plūsmu orientēti varianti: BSON (MongoDB), JSON līnijas (žurnāli, ML datu kopas), MessagePack.
  • JS/TS rīku konfigurācija: package.json, tsconfig.json, composer.json.

Kad lietot YAML?

YAML ir nepieciešams, tiklīdz cilvēks regulāri rediģē failu. Tās tipiskie lietošanas gadījumi:

  • Docker Compose (docker-compose.yml) un sakraujiet profilus.
  • Kubernetes manifesti (izvietošanas, apkalpošanas, ienākšanas, stūres diagrammas).
  • Iespējamas rokasgrāmatas un krājumi.
  • CI/CD cauruļvadi: GitHub Actions, GitLab CI, CircleCI, Bitbucket cauruļvadi.
  • OpenAPI/Swagger un AsyncAPI specifikācijas.
  • Anotētas lietojumprogrammas konfigurācija (Symfony, Spring Boot, Rails), kur komentāri ir noderīgi.
  • Faili, kas bieži tiek rediģēti ar roku, kur kodolīgums un lasāmība ir svarīgāki par parsēšanas ātrumu.

Bieži sastopamās nepilnības YAML

YAML ir pieļaujamāks nekā JSON, padarot to par spēcīgu, bet nodevīgu formātu. Visbiežāk sastopamās nepilnības:

  • Atkāpe: specifikācijas aizliedz tabulēšanas izmantošanu, ir derīgas tikai atstarpes. Sajaucot abus vai mainot atstarpju skaitu vienā blokā, parsēšana tiek pārtraukta.
  • Automātiska skalāra piespiešana: , , ieslēgts, izslēgts, patiess, false, null, nav, nulles vai booles tiek parsētas kā ~. Slazda piemērs: pasta indekss 01234 bez pēdiņām kļūst par veselu skaitli 1234, un valsts nosaukums NO (Norvēģija) kļūst par false. Neviennozīmīgas virknes vienmēr iekļaujiet pēdiņās.
  • Daudzrindu virknes: | (bloka burts) saglabā rindu pārtraukumus tādus, kādi tie ir, savukārt > (salocīts) rindiņas pārtraukumus aizstāj ar atstarpēm. Mainošie karodziņi - un + pielāgo darbību pēdējā lēcienā.
  • YAML 1.1 pret 1.2: 1.1 (joprojām ļoti bieži, piemēram, izmantojot PyYAML pēc noklusējuma) uzskata jā/nē/ieslēgts/izslēgts kā Būla vērtības, kuras 1.2 noņēma. Uzvedība atšķiras arī no 8. bāzes skaitļiem.
  • Iedomātie datumi: 2024-01-15 bez pēdiņām daži parsētāji interpretē kā datuma objektu, nevis kā virkni.

Blakus piemēri

Tas pats dokuments, kas izteikts JSON, pēc tam YAML. Vienkārša lietojumprogrammas konfigurācija ar tās atkarībām un vidi:

JSON versija

{
    "name": "cdrn-app",
    "versija": "1.14.2",
    "vide": "ražošana",
    "atkarības": {
        "php": "^8.3",
        "symfony/framework-bundle": "^7.0",
        "doktrīna/orm": "^3.0"
    },
    "funkcijas": ["kešatmiņa", "pasts", "rinda"],
    "atkļūdošana": nepatiess
}

Ekvivalenta YAML versija

# Lietojumprogrammas konfigurācija
nosaukums: cdrn-app
versija: 1.14.2
vide: ražošana
atkarības:
    php: '^8.3'
    symfony/framework-bundle: '^7.0'
    doktrīna/orm: '^3.0'
funkcijas:
    - kešatmiņa
    - pastnieks
    - asti
atkļūdošana: false

YAML versijai ir aptuveni par 25% mazākas rakstzīmes, tā pieņem vadošo komentāru un skan kā rekvizītu saraksts bez sintaktiskā trokšņa.

Kā lietot pārveidotāju

Datu konvertēšanas darbības:

  1. Ievades laukā ielīmējiet avota dokumentu (JSON vai YAML).
  2. Atlasiet vēlamo konversijas virzienu (JSON uz YAML vai YAML uz JSON).
  3. Noklikšķiniet uz konvertēšanas pogas: formatētais rezultāts tiek parādīts izvades apgabalā.
  4. Pārbaudiet atveidojumu un pēc tam izmantojiet kopēšanas pogu, lai izgūtu rezultātu starpliktuvē.

Konvertēšana tiek veikta lokāli jūsu pārlūkprogrammā vai izmantojot īpašu servera maršrutu atkarībā no rīkiem: sensitīvi dati netiek saglabāti.

Bieži uzdotie jautājumi

JSON vai YAML maniem konfigurācijas failiem?

Ja ekosistēma uzliek formātu (Kubernetes YAML, package.json JSON), ievērojiet noteikumus. Pretējā gadījumā dodiet priekšroku YAML garām, anotētām konfigurācijām, kuras rediģējat manuāli, un JSON konfigurācijām, kuras ģenerē programma vai ko patērē kods. Noderīgu komentāru klātbūtne bieži ir izšķirošais arguments par labu YAML.

Kā saglabāt komentārus, braucot turp un atpakaļ no YAML uz JSON uz YAML?

Tu nevari. JSON neatbalsta komentārus: tiklīdz YAML konvertējat uz JSON, komentāri tiek neatgriezeniski zaudēti. Lai saglabātu komentārus programmatiskās rediģēšanas laikā, izmantojiet parsētāju, kas saglabā formatējumu, piemēram, ruamel.yaml programmā Python turp un atpakaļ režīmā, vai arī pilnībā izvairieties no JSON izmantošanas.

Kāpēc mans YAML fails lokāli pareizi parsē, bet neizdodas ražošanā?

Bieži sastopamie cēloņi: dažādas parsētāja versijas (YAML 1.1 un 1.2), redaktora ieviestas cilnes, nekotētas vērtības, kas izskatās kā Būla vērtības (NO, off) vai cipari (01234), failu kodējums (UTF-8 BOM slikti apstrādāts). Sistemātiski citējiet neskaidras virknes un savā projektā iestatiet parsētāja versiju.

Vai JSON ir YAML apakškopa?

Kopš YAML 1.2, praksē jā: jebkurš derīgs JSON dokuments ir derīgs YAML 1.2 dokuments. Pretējs ir nepatiess: YAML dokumentu, kurā tiek izmantoti komentāri, enkuri, netieši datumi vai vairāki dokumenti failā, nevar tikt izteikts tieši JSON, nezaudējot informāciju.

Kādas JSON un YAML alternatīvas jums jāzina?

TOML: populārs konfigurācijā (Cargo, pyproject.toml), labs kompromiss starp lasāmību un nepārprotamu rakstīšanu. INI: ļoti vienkārša, taču nav standarta ligzdotas struktūras. XML: detalizēts, taču joprojām attiecas uz SOAP un dažām mantotām Java konfigurācijām. HCL: izmanto Terraform. JSON5 un JSONC: JSON paplašinājumi, kas pieļauj komentārus un beigu komatus.

Kāds ir YAML un JSON svars?

Līdzvērtīgai struktūrai YAML parasti ir par 15 līdz 30% īsāks baitos, jo ap taustiņiem un vairumam virkņu nav pēdiņu un nav iekavas. Vadā (HTTP transports) samazinātais JSON joprojām ir salīdzināms, bet YAML saglabājas kompaktāks lasāmā versijā. Lai nodrošinātu tīru veiktspēju parsēšanas pusē, JSON ir vairākas reizes ātrāks, kas attaisno tā izmantošanu lielas trafika API.

Pieprasījuma piemērs

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

Ievades shēma

Lauks Tips Obligāts Noklusējums
json text
space_tabulation integer

Endpoint

  • GET https://cdrn.fr/api/v1/tools - uzskaita visus pieejamos rīkus
  • GET https://cdrn.fr/api/v1/tools/json-yaml-converter - iegūst šī rīka shēmu
  • POST https://cdrn.fr/api/v1/tools/json-yaml-converter/execute - izpilda šo rīku ar JSON payload