JSON vs YAML: erot ja käyttötapaukset

JSON ja YAML ovat kaksi yleisintä tekstipohjaista sarjallistamismuotoa, joita käytetään rakenteellisen tiedon kuvaamiseen: sovellusasetukset, API-sanomat, infrastruktuuritiedostot, Kubernetes-manifestit, CI/CD-putket. Molemmat edustavat samoja perusrakenteita (objektit, listat, skalaarit) mutta eri filosofioilla: JSON painottaa koneluettavuutta ja universaalisuutta, YAML taas ihmisen luettavuutta ja tiiviyttä. Tämä artikkeli vertailee näitä kahta muotoa kohta kohdalta auttaakseen sinua valitsemaan.

Mikä on JSON?

JSON (JavaScript Object Notation) on Douglas Crockfordin 2000-luvun alussa esittelemä sarjallistamismuoto, joka on johdettu JavaScriptin objekti-literaalisyntaksista. Se on standardoitu RFC 8259- ja ECMA-404-asiakirjoilla, ja se on nykyään verkon keskeinen muoto: lähes kaikki REST API -rajapinnat, NoSQL-tietokannat ja frontend-asetukset käyttävät sitä.

JSON perustuu kahteen rakenteeseen:

  • Järjestetty kokoelma avain-arvo-pareja (objekti, aaltosuluissa)
  • Järjestetty luettelo arvoja (taulukko, hakasuluissa)

Skalaariarvot are string, number, true, false tai null. Merkkijonot on pakko ympäröidä kaksoislainausmerkeillä. JSON ei tue kommentteja.

Mikä on YAML?

YAML (YAML Ain't Markup Language) on vuonna 2001 ilmestynyt muoto, joka on suunniteltu alusta alkaen ihmisluettavaksi. Nykyinen spesifikaatio on YAML 1.2.2. Sen tunnusomainen piirre on sisennys hierarkian ilmaisemiseen, Python-kielen tapaan.

YAML on JSON:n yläjoukko versiosta 1.2 lähtien: jokainen kelvollinen JSON-dokumentti on kelvollinen YAML-dokumentti. Mutta YAML lisää paljon: kommentit, merkkijonot ilman lainausmerkkejä, moniriviset tekstilohkot, ankkurit ja aliakset, tyypityksen tunnisteet ja useat dokumentit samassa tiedostossa (---).

Syntaksien vertailu

Tässä on sama rakenne molemmissa muodoissa.

JSON

{
  "name": "cdrn",
  "version": "1.14",
  "tags": ["seo", "tools", "open-source"],
  "author": {
    "name": "Adrien",
    "email": "contact@example.com"
  },
  "active": true,
  "stars": null
}

YAML

# Projektin asetukset
name: cdrn
version: "1.14"
tags:
  - seo
  - tools
  - open-source
author:
  name: Adrien
  email: contact@example.com
active: true
stars: null

Samalla sisällöllä YAML vie suunnilleen saman verran rivejä, mutta välttää aaltosulkeet, hakasulkeet, loppupilkut ja lainausmerkit useimmissa merkkijonoissa. Kommentit (#-rivit) ovat sallittuja.

Tuetut tyypit

JSON tuntee 6 tyyppiä: object, array, string, number, boolean, null. Ei natiivia päivämäärää, ei binaaria, eikä selkeää eroa kokonaisluvun ja liukuluvun välillä.

YAML 1.2 tuntee samat kuin JSON ja lisää: ISO 8601 -aikaleimat, binaaritiedot (base64-koodattuina !!binary-tunnisteella), erilliset kokonaisluvut ja liukuluvut, äärettömyyden, NaN:n ja mukautetut tyypit tunnisteiden kautta (!!str, !!int, !!float...). YAML 1.1 hyväksyi yes/no/on/off-arvot totuusarvoina: klassinen sudenkuoppa vanhoissa jäsentimissä.

Suorituskyky ja ekosysteemi

JSON on tyypillisesti 3–10 kertaa nopeampi jäsentää kuin YAML, ja sen jäsentimiä on saatavilla kaikkialla (sisäänrakennettuna lähes kaikkiin kieliin). YAML-kirjastot ovat raskaampia, koska niiden on hallittava monimutkaisempi kielioppi (ankkurit, tunnisteet, useat dokumentit).

Ekosysteemin osalta: JSON hallitsee HTTP API -rajapintoja, NoSQL-tietokantoja (MongoDB, CouchDB) ja tiedostoja kuten package.json, composer.json, tsconfig.json. YAML on vakiinnuttanut asemansa sovellusasetuksissa ja infrastruktuuri koodina (IaC): Symfony, Spring Boot, Rails, Docker Compose, Kubernetes, GitHub Actions, GitLab CI, Ansible.

Vertailutaulukko

Kriteeri JSON YAML
IhmisluettavuusHyväErinomainen
KoneluettavuusErinomainenTyydyttävä
KommentitEiKyllä (#)
Merkitsevä sisennysEiKyllä
JäsennysnopeusNopeaHitaampi
Rikkaat tyypit (pvm, binaari)EiKyllä
Ankkurit / aliaksetEiKyllä
Tyypillinen käyttötapausAPI, tallennus, tiedonsiirtoAsetukset, infra koodina

Tyypilliset käyttötapaukset

Valitse JSON, kun

  • Suunnittelet REST API -rajapintaa tai webhook-päätepistettä
  • Tallennat tietoja NoSQL-tietokantaan tai välimuistiin
  • Siirrät tietoja frontendin ja backendin välillä
  • Jäsennysnopeus on kriittistä (suuri liikennemäärä, edge)
  • Haluat universaalisti tuetun muodon ilman riippuvuuksia

Valitse YAML, kun

  • Kirjoitat sovellusasetuksia, joita muokataan käsin
  • Tarvitset kommentteja asetusten dokumentointiin
  • Käytät Kubernetesia, Docker Composea, GitHub Actionsia tai Ansiblea
  • Haluat monistaa lohkoja ankkureiden ja aliasten avulla
  • Luettavuus on tärkeämpää kuin käsittelynopeus

Suositus

Yksinkertainen sääntö: JSON koneelle, YAML ihmiselle. Jos tiedostosi on ohjelman luoma tai kuluttama, valitse JSON. Jos se on käsin kirjoitettu ja luettu, valitse YAML. Monet ekosysteemit hyväksyvät molemmat: Symfony lukee YAML-, JSON- ja XML-asetuksia, ja Kubernetes hyväksyy molemmat manifestiensa muodoksi. Epäselvissä tapauksissa valitse YAML ihmisen asetuksille ja JSON automatisoiduille virroille.

Voit testata muunnosta muodosta toiseen meidän JSON/YAML-muuntimellamme ja muotoilla dokumentin nopeasti JSON-muotoilijalla.

Usein kysytyt kysymykset

Onko YAML hitaampi kuin JSON?

Kyllä, yleisesti ottaen YAML-dokumentin jäsentäminen vaatii useita kertoja enemmän suoritinaikaa kuin saman JSON-dokumentin, koska YAML:n kielioppi on monimutkaisempi (sisennys, tunnisteet, ankkurit). Käytännössä ero on merkityksetön asetustiedostoille. Se muuttuu havaittavaksi vasta, kun jäsennetään kymmeniä tuhansia dokumentteja silmukassa.

Voiko YAML:n muuntaa automaattisesti JSON:ksi?

Kyllä: mikä tahansa YAML-dokumentti voidaan muuntaa JSON:ksi ilman häviötä, jos vältetään YAML-kohtaisia erikoistyyppejä (aikaleimat, ankkurit). Toisinpäin se on vielä helpompaa, sillä JSON on YAML 1.2:n osajoukko. Muuntimemme hoitaa molemmat suunnat.

Hyväksyykö JSON kommentteja?

Ei, JSON-standardi kieltää ne. On olemassa murteita (JSON5, JSONC), mutta ne eivät ole universaalisti tuettuja. Jos tarvitset kommentteja, valitse YAML tai TOML.

Miksi Kubernetes käyttää YAML:ia eikä JSON:ia?

Ihmiset kirjoittavat ja lukevat Kubernetes-manifesteja. YAML tarjoaa kommentit, vähemmän hälyä sisältävän syntaksin ja mahdollisuuden käyttää ankkureita. Kubernetes-rajapinta hyväksyy myös JSON:n, mutta vakiintunut tapa on käyttää YAML:ia.

Onko YAML todella JSON:n yläjoukko?

Kyllä YAML 1.2 -versiosta lähtien: jokainen kelvollinen JSON-dokumentti on kelvollinen YAML-dokumentti. Tämä mahdollistaa JSON-koodin sisällyttämisen YAML-tiedostoon sitä muuttamatta, mikä on kätevää automaattisesti luoduille tai kopioiduille lohkoille.