JSON vs YAML: skirtumai ir naudojimo atvejai

JSON ir YAML yra du dažniausiai naudojami teksto serializavimo formatai dažniausiai naudojami struktūriniams duomenims apibūdinti: programos konfigūracija, API naudingoji apkrova, infrastruktūros failai, Kubernetes manifestai, CI/CD konvejeriai. Abu atstovauja tą patį pagrindinės struktūros (objektai, sąrašai, skaliarai), bet skirtingos filosofijos: JSON teikia pirmenybę mašininiam skaitymui ir universalumui, YAML daugiausia dėmesio skiria skaitymui žmogui ir glaustumas. Šiame straipsnyje abu formatai lyginami taškais, kad būtų lengviau pasirinkti.

Kas yra JSON?

JSON („JavaScript Object Notation“) yra serializacijos formatas, kurį pristatė Douglasas Crockfordas 2000-ųjų pradžioje išvedė JavaScript objekto pažodinę sintaksę. Standartizuota pagal RFC 8259 ir ECMA-404, šiandien yra pagrindinis žiniatinklio formatas: beveik visos REST API, NoSQL duomenų bazės ir Jį naudoja frontend konfigūracijos.

JSON pagrįstas dviem struktūromis:

  • Sutvarkytas raktų ir reikšmių porų rinkinys (objektas, įdėtas į skliaustus)
  • Sutvarkytas reikšmių sąrašas (masyvas, laužtiniuose skliaustuose)

Skaliarinės reikšmės yra string, skaičius, true, false arba null. Stygos turi būti suvestos kabutėmis. dvejetai. JSON nepalaiko komentarų.

Kas yra YAML?

YAML (YAML Ain't Markup Language) yra formatas, kuris pasirodė 2001 m., sukurtas nuo pat pradžių kad būtų skaitomas žmogui. Dabartinė specifikacija yra YAML 1.2.2. Jo išskirtinė savybė: jame naudojama įtrauka išreikšti hierarchija, kaip Python.

YAML yra JSON superrinkinys nuo 1.2 versijos: bet koks galiojantis JSON dokumentas yra dokumentas Galiojantis YAML. Tačiau YAML prideda daug: komentarai, necituojamos eilutės, kelios eilutės, inkarai ir slapyvardžiai, žymės, skirtos aiškiai įvesti tekstą, keli dokumentai tame pačiame faile (---).

Lyginamoji sintaksė

Čia yra ta pati struktūra, išreikšta abiem formatais.

JSON

{
  "vardas": "cdrn",
  "versija": "1.14",
  "žymos": ["seo", "įrankiai", "atvirojo kodo"],
  "autorius": {
    "vardas": "Adrien",
    "email": "contact@example.com"
  },
  "aktyvus": tiesa,
  "žvaigždės": nulis
}

YAML

# Projekto konfigūracija
pavadinimas: cdrn
versija: "1.14"
žymos:
  - SEO
  - įrankiai
  - atvirojo kodo
autorius:
  vardas: Adrien
  paštas: contact@example.com
aktyvus: tiesa
žvaigždės: null

Tame pačiame turinyje YAML užima maždaug tiek pat eilučių, bet vengia skliaustų, skliausteliuose, kableliuose ir kabutėse daugumoje eilučių. Komentarai (eilutės #) yra leidžiami.

Palaikomi tipai

JSON žino 6 tipus: objektas, masyvas, string, skaičius, loginis, nulis. Nėra gimtosios datos, nėra dvejetainių, nėra aiškaus sveikojo skaičiaus / slankiojo skirtumo.

YAML 1.2 žino tą patį kaip JSON ir prideda: ISO 8601 laiko žymes, dvejetainę (base64 užkoduota per žyma !!dvejetainė), atskiri sveikieji skaičiai ir plūdės, begalybė, NaN ir pasirinktiniai tipai per žymas (!!str, !!int, !!float...). Priimta YAML 1.1 taip/ne/įjungta/išjungta kaip loginiai: klasikinis spąstai su senais analizatoriais.

Našumas ir ekosistema

JSON paprastai 3–10 kartų greičiau analizuojamas nei YAML ir jo analizatoriai yra prieinami visur (integruoti į beveik visų kalbų vykdymo laiką). bibliotekos YAML yra sunkesni, nes jie valdo turtingesnę gramatiką (prieraiščiai, žymos, keli dokumentai).

Iš ekosistemos pusės: JSON dominuoja HTTP API, NoSQL duomenų bazėse (MongoDB, CouchDB), failuose package.json, composer.json, tsconfig.json. YAML įsitvirtino programos konfigūracijai ir infrastruktūrai kaip kodui: Symfony, Spring Boot, Rails, „Docker Compose“, „Kubernetes“, „GitHub Actions“, „GitLab CI“, „Ansible“.

Palyginimo lentelė

Kriterijus JSON YAML
Žmogaus skaitomumasGerasPuikus
Mašininis skaitymasPuikusTeisingas
KomentaraiNeTaip (#)
Svarbi įtraukaNeTaip
Nagrinėjimo greitisGreitasLėtesnis
Turtingi tipai (data, dvejetainis)NeTaip
Inkarai / slapyvardisNeTaip
Tipiniai naudojimo atvejaiAPI, saugykla, keitimasis duomenimisKonfigūracija, infrastruktūros kaip kodas

Tipiški naudojimo atvejai

Pasirinkite JSON kada

  • Kuriate REST API arba „Webhook“ galinį tašką
  • Duomenis saugote NoSQL duomenų bazėje arba talpykloje
  • Keičiatės duomenimis tarp frontend ir backend
  • Išnagrinėjimo našumas yra labai svarbus (didelis pralaidumas, kraštas)
  • Norite visuotinai palaikomo formato be priklausomybių

Pasirinkite YAML kada

  • Rašote rankiniu būdu redaguojamą programos konfigūraciją
  • Norint dokumentuoti parinktis reikia atsiliepimų
  • Rašote „Kubernetes“, „Docker Compose“, „GitHub Actions“, „Ansible“
  • Norite priskirti blokus su prierais ir slapyvardžiais
  • Įskaitomumas yra svarbesnis už apdorojimo greitį

Rekomendacija

Paprasta taisyklė: JSON – mašinai, YAML – žmogui. Jei jūsų failas yra sukurta arba naudojama programos, paimkite JSON. Jei tai parašyta ir perskaityta ranka, paimkite YAML. Daugelis ekosistemų priima abu: Symfony nuskaito YAML, JSON ir XML savo konfigūracijas, Kubernetesas priima ir vieną, ir kitą. Jei abejojate, eikite į YAML Žmogaus konfigūracija ir JSON automatiniams srautams.

Galite išbandyti konvertavimą iš vieno formato į kitą naudodami mūsų JSON / YAML keitiklis ir greitai suformatuokite dokumentą naudodami JSON formatu.

Dažnai užduodami klausimai

Ar YAML lėtesnis nei JSON?

Taip, paprastai YAML dokumento analizė kainuoja kelis kartus daugiau procesoriaus nei jo analizė tas pats JSON dokumentas, nes YAML gramatika yra turtingesnė (įtrauka, žymos, inkarai). Į praktiška, konfigūracijos failams skirtumas yra nereikšmingas. Pasidaro jautrus, kai jūs vėl ir vėl analizuojate dešimtis tūkstančių dokumentų.

Ar galime automatiškai konvertuoti YAML į JSON?

Taip: bet kurį YAML dokumentą galima konvertuoti į JSON be nuostolių, jei vengsite YAML tipų konkrečios (laiko žymos, inkarai). Atvirkščiai yra dar paprastesni, nes JSON yra poaibis iš YAML 1.2. Mūsų konverteris eina į abi puses.

Ar JSON priima komentarus?

Ne, JSON standartas juos draudžia. Tarmės egzistuoja (JSON5, JSONC), bet jų nėra visuotinai palaikoma. Jei reikia komentarų, paimkite YAML arba TOML.

Kodėl Kubernetes naudoja YAML, o ne JSON?

Kubernetes manifestus rašo ir peržiūri žmonės. YAML siūlo komentarus, a mažiau triukšminga sintaksė ir faktoringo per inkarus galimybė. Kubernetes API priima taip pat JSON, tačiau idiomatinis naudojimas išlieka YAML.

Ar YAML tikrai yra JSON superrinkinys?

Taip nuo YAML 1.2: bet koks galiojantis JSON dokumentas yra galiojantis YAML dokumentas. Tai leidžia įterpti JSON į YAML failą jo nekeičiant, o tai yra praktiška blokams sugeneruoti arba nukopijuoti ir įklijuoti.