Alex Gamela
Alexandra Mendes

25 februari 2024

Min läsning

YAML kontra JSON: vad är skillnaden?

YAML-bokstavsrutnät versus en 3D-ring ovanför {JSON}, som jämför skillnaden mellan båda formaten.

Det korta svaret: JSON är det säkrare valet för datautbyte mellan maskiner, medan YAML är säkrare för konfigurationer som redigeras manuellt. Allt kokar ner till ett designbeslut: var formaten placerar sin struktur. JSON fäster byggställningen på utsidan med klamrar och parenteser som syns. YAML gömmer den inuti väggarna med hjälp av blanksteg som inte syns. Båda är format för serialisering av data som utför samma uppgift, vilket är anledningen till att valet ofta görs av gammal vana snarare än medvetet, och varför så många team till slut underhåller båda. Så här fattar du beslutet.

blå pil till vänster
Imaginary Cloud-logotyp

Vad är JSON

JSON står för JavaScript Object Notation och, som namnet antyder, härstammar det från JavaScript-dataformat. Det är en öppen standard: lättviktig, textbaserad och med en medvetet begränsad uppsättning datatyper. Kort syntax, enkel struktur och mycket lättläst.

Det används för att skicka data till en server och tillbaka till klienten, som ett kuvert som håller datan när den skickas mellan parter. Programmerare använder det i mobilappar, i dokumentdatabaser som MongoDB (som lagrar ett binärt, JSON-liknande format som kallas BSON), i meddelandeköer och loggpipelines, samt i användarvända REST-API:er som ett smidigare alternativ till XML. Det är standardformatet för nyttolast i REST-API:er, och alla webbläsare tolkar det inbyggt.

Enligt JSON-utvecklaren Douglas Crockford användes ett språk med samma principer redan på Netscape 1996, men JSON etablerades som en vanlig syntax först omkring 2001. Det är språkoberoende, så det fungerar med alla programmeringsspråk, och den portabiliteten är den främsta anledningen till att det spreds som det gjorde.

JSON-filformat och specifikation

En .json -fil är en ren textfil som innehåller ett enskilt JSON-dokument, sparad med filändelsen .json och läsbar i alla textredigerare. Den använder en kort lista med datatyper: strängar, tal, objekt, arrayer, booleska värden och null. Syntaxen lånar konventioner som är bekanta för programmerare av C-familjens språk: C, C++, C#, Java, JavaScript, Perl, Python och så vidare. Som den officiella JSON-webbplatsen uttrycker det är ett objekt en oordnad uppsättning namn/värde-par som börjar med en vänsterklammer och slutar med en högerklammer, där varje namn följs av ett kolon och paren separeras med kommatecken.

Den fungerande grammatiken får plats på den där enda sidan på json.org: inte en sammanfattning av specifikationen, utan själva specifikationen. Formatet är också formellt standardiserat som ECMA-404 (2:a utgåvan, 2017) och IETF RFC 8259 (2017), men grammatiken som dessa dokument fastställer är densamma kompakta. Kom ihåg det när YAML-specifikationen dyker upp senare.

Syntaxregler för JSON

  • Rotnoden måste vara en array eller ett objekt.
  • Data skrivs som namn/värde-par, separerade med kommatecken.
  • Objekt avgränsas med klammerparenteser; hakparenteser innehåller arrayer.
  • Objekt kan innehålla arrayer för att skapa listor.
  • Namn och värden omges av citattecken och separeras med ett kolon.

JSON-exempel

Samma data, först i JSON, med information om heavy metal-bandet Metallica:

{
  "band": "Metallica",
  "formed": 1981,
  "origin": "Los Angeles, California",
  "genres": ["thrash metal", "heavy metal"],
  "active": true,
  "members": [
    { "name": "James Hetfield", "role": "vocals, rhythm guitar", "joined": 1981 },
    { "name": "Lars Ulrich", "role": "drums", "joined": 1981 },
    { "name": "Kirk Hammett", "role": "lead guitar", "joined": 1983 },
    { "name": "Robert Trujillo", "role": "bass", "joined": 2003 }
  ],
  "disbanded": null
}

Klammerparenteser avgränsar objektet och arrayerna; varje post omges av citattecken; ett kolon separerar varje namn från dess värde, och ett kommatecken separerar paren från varandra. All struktur finns där på utsidan så att du enkelt kan räkna den.

Var JSON fungerar och var det inte gör det

Det fungerar eftersom syntaxen är kompakt och läsbar för människor, uppmärkningen är minimal, parsning går snabbt i alla språk och stödet är i princip universellt.

Det brister på tre punkter. Datatyperna stannar vid strängar, tal, objekt, arrayer, booleska värden och null, så allt mer komplext måste kodas som en sträng och avkodas manuellt i andra änden. Det finns inget stöd för namnrymder, kommentarer eller attribut, och avsaknaden av kommentarer är något man märker i en konfigurationsfil. Dessutom är strukturen medvetet enkel, vilket gör att komplex konfiguration tenderar att bygga på egna konventioner ovanpå den.

blå pil till vänster
Imaginary Cloud-logotyp

Vad är YAML

YAML stod tidigare för Yet Another Markup Language, tills betydelsen ändrades till YAML Ain't Markup Language för att lägga betoningen på data snarare än dokument. Det är ett mycket lättläst och lättviktigt format som oftast används för att lagra konfigurationer för DevOps-verktyg som Elasticsearch, Docker, Kubernetes, Prometheus och Ansible.

Som den officiella webbplatsen, som själv är skriven i YAML, uttrycker det: YAML är ett användarvänligt dataserialiseringsspråk för alla programmeringsspråk. Det är ett dataserialiseringsspråk, även om det lika ofta används för konfigurationsfiler. Vi kommer att betrakta det ur ett dataserialiseringsperspektiv.

YAML presenterades första gången 2001. Grundarna är Ingy dot Net, Clark Evans och Oren Ben-Kiki, som gick samman för att skapa något enklare än XML. Sedan dess har det blivit standardformatet för konfiguration i nästan hela DevOps-verktygskedjan, vilket innebär att valet ofta redan är gjort åt dig när du börjar.

YAML-filformat och specifikation

En YAML-fil är en ren textfil som sparas som .yaml eller .yml, och som innehåller ett eller flera YAML-dokument. En fil kan innehålla flera dokument separerade av en rad med tre bindestreck, vilket är hur ett Kubernetes-manifest buntar ihop en deployment och en tjänst. Det har stöd för kommentarer, vilket i sig gör det smidigt att redigera.

YAML är en superset av JSON: alla giltiga JSON-dokument är även giltig YAML, så en YAML-fil kan innehålla JSON-objekt och en YAML-tolk läser en .json -fil utan ändringar. Det hanterar komplexa datatyper utan problem och kan nästla objekt så djupt du vill. Samma flexibilitet är anledningen till att vissa system begränsar vilka YAML-funktioner de accepterar.

Syntaxregler för YAML

  • Nyckel-värde-par separeras med kolon.
  • Strängar omsluts inte av klammerparenteser.
  • Indrag definierar datastrukturen, och mellanslag före en nyckel är betydelsefulla.
  • Listor inleds med bindestreck.
  • Kommentarer är tillåtna, föregångna av ett brädtecken (#).
  • Blockskalärer skriver flerradiga strängar som ett indenterat block: vertikalstrecket (|) behåller radbrytningar, medan större än-tecknet (>) slår ihop dem till en enda rad.
  • Ankare och alias gör att ett block kan definieras en gång och återanvändas på andra ställen, så att delad konfiguration skrivs på ett ställe istället för fem.

YAML-exempel

Samma data igen, nu i YAML:

band: Metallica
formed: 1981
origin: Los Angeles, California
genres:
  - thrash metal
  - heavy metal
active: true
members:
  - name: James Hetfield
    role: vocals, rhythm guitar
    joined: 1981
  - name: Lars Ulrich
    role: drums
    joined: 1981
  - name: Kirk Hammett
    role: lead guitar
    joined: 1983
  - name: Robert Trujillo
    role: bass
    joined: 2003
disbanded: null

Tre skillnader märks direkt. Klamrar och parenteser är borta, och indentering anger hierarkin. Citationstecknen är också borta, eftersom YAML härleder typen från värdet. Och medlemmarna är en sekvens av bindestreck istället för en kommaseparerad array, så att lägga till en femte innebär ett nytt block snarare än en ändring av skiljetecknen runt omkring.

Snyggare, ja. Men titta igen på var strukturen hamnade. I JSON-versionen är den uttrycklig. I YAML-versionen härleds den från blanksteg, ett helt annat löfte.

Kodediagram som jämför YAML- och JSON-syntax sida vid sida för att visa skillnaderna.
Figur 1: Var varje format håller sin struktur. Ursprungligt diagram, Imaginary Cloud.

Var YAML fungerar och var det inte gör det

Det fungerar eftersom syntaxen är lättläst, indentering anger struktur utan skiljetecken, kommentarer stöds, komplexa strukturer kan uttryckas och ankare gör att ett block kan återanvändas istället för att kopieras. Den återanvändningen är en anledning till att YAML används för att beskriva infrastruktur, till exempel Kubernetes-stackar, där samma inställningar återkommer i dussintals objekt.

Det brister precis där flexibiliteten finns. Felaktig indragning eller blanksteg genererar valideringsfel, eller ännu värre, en fil som tolkas korrekt men till något du inte avsåg. Dess deklarativa natur gör felsökning svårare: det finns inget att stega igenom, så felet uppstår först när filen tolkas eller tillämpas. Och typinferens har sina fällor, där den mest kända är landskoden för Norge, NO, som läses som det booleska värdet false om du inte sätter det inom citattecken. Strikt talat hör det beteendet till YAML 1.1: den nuvarande specifikationen, YAML 1.2, revision 1.2.2 (oktober 2021), begränsar booleska värden till endast true och false. Fällan lever kvar i praktiken eftersom en stor mängd tolkar fortfarande använder 1.1-semantik som standard, så i praktiken sätter du citattecken runt NO och går vidare.

blå pil till vänster
Imaginary Cloud-logotyp

Skillnader mellan JSON och YAML

YAML och JSON är två populära format som liknar varandra i struktur och användbarhet. Deras skillnader i design, syntax och funktionalitet gör att valet mellan dem beror på syftet.

FunktionJSONYAML
SyntaxMåsvingar, hakparenteser, citattecken och kommateckenIndrag, kolon och bindestreck
KommentarerStöds ejStöds med #
DatatyperSträngar, tal, objekt, matriser, boolean, nullDetsamma, samt datum och tidsstämplar
TolkningshastighetSnabbare: en liten, entydig grammatikLångsammare: en betydligt större specifikation
Mänsklig läsbarhetBra, när man väl ser förbi skiljetecknenBättre för manuell redigering, svårare för att överblicka struktur
ÅteranvändningIngenAnkare och alias
VerktygsstödInbyggt i webbläsare och nästan alla standardbibliotekKräver ett externt bibliotek i de flesta språk
Typisk användningAPI:er, datautbyte, maskingenererade filerKonfigurationsfiler, CI-pipeliner, infrastruktur

En grundläggande skillnad ligger till grund för allt detta. JSON utformades för att maskiner ska kunna skriva och läsa det, så det anger sin struktur tydligt och lämnar inget utrymme för feltolkningar av en parser. YAML utformades för människor, så det flyttar strukturen till blanksteg, vilket gör att filen ser ut som en disposition snarare än kod.

Skillnaden i parsning beror på specifikationerna, inte på några prestandatester. JSON-grammatiken ryms på en enda sida på json.org. YAML 1.2-specifikationen omfattar dussintals sidor som täcker ankare, taggar, blockskalärer, flera dokument och implicit typning: mer arbete för parsern och fler sätt för den att göra fel. Betrakta hastighetsskillnaden som en skillnad i karaktär snarare än ett mätvärde: irrelevant för en fil som läses en gång vid uppstart, men mätbar för en tjänst som deserialiserar data hela dagen.

Det är också därför de felar på olika sätt. En felaktig JSON-fil orsakar oftast ett tydligt och omedelbart avbrott i parsningen. En felaktig YAML-fil parsas ofta utan problem men får en helt annan innebörd, eftersom ett indrag flyttat en nyckel under fel förälder, eller för att ett värde utan citattecken tolkats som fel datatyp. Tysta fel är de som kostar mest.

blå pil till vänster
Imaginary Cloud-logotyp

YAML eller JSON: vilket är bäst?

Inget av dem, rent abstrakt. Frågan får sitt svar först när du vet vad uppgiften är, så låt funktionen styra: vad behöver du formatet till?

JSON är det bättre valet för datautbyte. Det går snabbt att tolka, stöds överallt utan beroenden och varje objekt är tydligt avgränsat, vilket förhindrar att en tolk läser strukturen fel. Nackdelen är det begränsade urvalet av datatyper, vilket gör att mer komplexa värden måste kodas som strängar och avkodas vid behov. Om du designar sådana utbyten, väger vår jämförelse av GraphQL vs REST de två dominerande API-stilarna mot varandra.

YAML är det bättre valet för konfigurationer som underhålls av människor. Det tillåter kommentarer, kan nästlas djupt utan att det blir en röra av skiljetecken, och ankare gör att delade inställningar bara behöver skrivas en gång. Nackdelen är att strukturen bygger på blanksteg, vilket innebär att en fil kan vara korrekt formaterad men ändå innehålla fel, och att tolken har mer arbete att utföra.

Kort sagt: om ett program skriver filen, använd JSON. Om en människa skriver filen, använd YAML och lägg till en validerare framför.

blå pil till vänster
Imaginary Cloud-logotyp

Så här såg det ut vid en verklig migrering

Den här uppdelningen är inte abstrakt för oss. När vi flyttade FlippedNormals, en marknadsplats för datorgrafik som vuxit ur WordPress, från Heroku till AWS, var utlösaren precis den avvägning som nämns ovan: Herokus hanterade dynos gav oss liten kontroll över skalningen i takt med att katalogen växte, så vi migrerade plattformen till AWS och slutförde den första etappen på två månader, parallellt med en databasflytt från MySQL till PostgreSQL. En infrastrukturmigrering av det slaget är där YAML-halvan av den här artikeln slutar vara teori: driftsättningen beskrivs, granskas och versionshanteras i konfigurationsfiler som redigeras manuellt.

JSON-halvan dök upp i samma miljö, i de nyttolaster som marknadsplatsens tjänster skickade mellan varandra: maskinskrivna, lästa tusentals gånger, aldrig redigerade för hand. Samma system, båda formaten, där varje format gör det det är bäst på.

blå pil till vänster
Imaginary Cloud-logotyp

Vad valet kostar dig

För de flesta team är detta inte ett estetiskt beslut. Notan landar på fem områden.

Konfigurationsfel som når produktion. YAML:s känslighet för blanksteg och typinferens innebär att en fil kan vara giltig men ändå felaktig. Ingen parser fångar den typen av fel: det krävs en schemakontroll, eller att driftsättningen misslyckas klockan tre på eftermiddagen. Alla arkiv där YAML styr infrastrukturen behöver schemavalidering och en formaterare i kontinuerlig integration, och det kräver ingenjörstid att sätta upp och underhålla.

Säkerhet vid parsning. YAML:s fullständiga inläsare kan skapa godtyckliga objekt från ett dokument, vilket i tysthet förvandlar en begäran om att tolka en fil till en licens att köra vad filen än beskriver, så fort indatan inte är betrodd. Det är därför bibliotek exponerar en säker inläsning, där PyYAML:s safe_load är det mest kända, och varför det bör vara standard i alla kodbaser som läser YAML som de inte själva skapat. JSON har ingen motsvarande sårbarhet, eftersom formatet inte kan beskriva en typ som ska instansieras.

Introduktionstid. JSON är bekant för alla som har använt ett API. YAML har ankare, alias, blockskalärer och flera dokument per fil, och en nyanställd möter allt detta under sin första vecka i en Kubernetes-miljö. Budgetera för upplärning, eller standardisera på en dokumenterad delmängd och skriv ner det.

Parsningskostnad i stor skala. För en konfigurationsfil som läses en gång vid uppstart är parsningstiden oväsentlig. För en tjänst som deserialiserar tusentals nyttolaster i sekunden är den inte det, och den mindre JSON-grammatiken är billigare att bearbeta.

Miljöer med blandade format. Det dyra resultatet är inget av formaten i sig. Det är kombinationen: konfiguration i YAML, fixturer i JSON, ett konverteringslager inklämt däremellan, och två uppsättningar valideringsregler som driver isär under arton månader. Välj ett format per syfte, skriv ner beslutet och validera varje del med ett schema: JSON Schema för JSON-sidan och ett av YAML-schemaverktygen för den andra.

blå pil till vänster
Imaginary Cloud-logotyp

Checklista för formatval

Checklista för format som jämför YAML och JSON: syntax, datatyper och läsbarhet.

Fyra frågor vi går igenom innan vi bestämmer oss för ett serialiseringsformat för ett projekt.

  • Vem skriver filen, en person eller ett program? Om ett program skriver den, använd JSON. Maskinskriven YAML ger dig både tolkningskostnaden och tvetydigheten utan någon av fördelarna med läsbarhet.
  • Behöver den kommentarer? Konfiguration behöver oftast det, eftersom anledningen till att ett värde är satt är lika viktig som själva värdet. JSON kan inte hantera kommentarer, och nycklar som fungerar som kommentarer är en nödlösning snarare än ett svar.
  • Hur valideras den innan den träder i kraft? Om svaret är att driftsättningen misslyckas, behöver formatet ett schema och en linter i pipelinen innan något annat görs.
  • Hur ofta läses den vid körning? En gång vid uppstart, välj det läsbara formatet. Tusentals gånger per sekund, välj det snabba.

Oftast pekar svaren inte på ett enda format för hela systemet. På de flesta plattformar vi bygger hamnar uppdelningen på samma ställe: YAML för det människor underhåller, pipelines, manifest och miljökonfiguration, och JSON för det tjänster skickar mellan varandra. Det misstag vi ser oftast är inte att man väljer fel format, utan att man låter båda sprida sig till samma uppgift utan att någon bestämmer vad som hör hemma var.

blå pil till vänster
Imaginary Cloud-logotyp

Vanliga frågor

Är YAML snabbare än JSON?

Nej. JSON parsas snabbare eftersom dess grammatik är begränsad till en enda sida och inte tillåter någon tvetydighet, medan YAML-specifikationen är betydligt mer omfattande och kräver typinferens. Skillnaden är försumbar för en konfigurationsfil som läses in en gång vid uppstart, men den spelar roll för en tjänst som kontinuerligt parsar nyttolaster.

Kan YAML läsa JSON-filer?

Ja. YAML är en övermängd av JSON, så alla giltiga JSON-dokument är även giltiga YAML-dokument, och en YAML-parser läser en .json -fil utan ändringar. Det omvända gäller inte: en JSON-parser kan inte läsa YAML.

Vad är en .json -fil?

En vanlig textfil som innehåller ett enskilt JSON-dokument och som sparats med filändelsen .json . Den innehåller ett objekt eller en array i roten, använder citattecken för nycklar och värden, och kan öppnas i vilken textredigerare som helst.

Vad är en YAML-fil?

En vanlig textfil som sparats som .yaml eller .yml och som innehåller ett eller flera YAML-dokument. Den använder indrag istället för klammerparenteser, har stöd för kommentarer och är standardformatet för konfiguration i verktyg som Kubernetes, Docker Compose och Ansible.

Vilket format bör jag använda för Kubernetes-konfiguration?

YAML, eftersom det är vad ekosystemet är skrivet i, och manifest redigeras och granskas av människor. Kubernetes accepterar JSON-motsvarigheten, men varje exempel, handledning och genererat manifest du stöter på kommer att vara i YAML.

Behöver jag en YAML-formaterare?

I alla arkiv där fler än en person redigerar YAML, ja. En formaterare tillsammans med en linter i CI fångar upp indenterings- och typinferensfel som en parser glatt accepterar men som ett kluster senare avvisar.

Är YAML säkert att parsa?

Endast med en säker inläsare (safe loader). Den fullständiga inläsaren kan instansiera godtyckliga objekt som beskrivs i dokumentet, så att parsa en otillförlitlig fil kan köra kod. Använd den säkra varianten som ditt bibliotek tillhandahåller, till exempel PyYAML:s safe_load, närhelst filen inte kommer från ditt eget arkiv.

När bör jag välja JSON framför YAML?

Närhelst ett program skriver eller läser filen istället för en människa: API-nyttolaster, meddelandeköer, loggrader, testfixturer, webbläsarlagring. Välj YAML när en människa underhåller filen och behöver kommentarer och struktur som är lätt att överblicka.

Kan jag konvertera mellan YAML och JSON?

Ja, och de flesta YAML-bibliotek gör det med en enda kodrad. Att konvertera YAML till JSON innebär att kommentarer och ankare går förlorade, så betrakta YAML som källan och JSON som den genererade artefakten, aldrig tvärtom.

Att välja ett serialiseringsformat är ett litet beslut med långsiktiga konsekvenser, och oftast den minst intressanta delen av en mycket större arkitekturfråga. Om du väger hur dina tjänster ska utbyta och lagra data, så hjälper vårt teknikteam dig gärna att gå igenom det.

Banner för att välja ett mjukvaruföretag med text om att bygga skalbara produkter och isometrisk enhetsgrafik.
blå pil till vänster
Imaginary Cloud-logotyp
Alex Gamela
Alex Gamela

Innehållsförfattare och digital medieproducent med intresse för det symbiotiska förhållandet mellan teknik och samhälle. Böcker, musik, och gitarrer är en konstant.

Läs fler inlägg av denna författare
Alexandra Mendes
Alexandra Mendes

Alexandra Mendes är Senior Growth Specialist på Imaginary Cloud med 3+ års erfarenhet av att skriva om mjukvaruutveckling, AI och digital transformation. Efter att ha avslutat en frontend-utvecklingskurs tog Alexandra upp några praktiska kodningskunskaper och arbetar nu nära med tekniska team. Alexandra brinner för hur ny teknik formar affärer och samhälle och tycker om att förvandla komplexa ämnen till tydligt och användbart innehåll för beslutsfattare.

Linkedin

Läs fler inlägg av denna författare

People who read this post, also found these interesting:

Dropdown caret icon