ToolDeck

YAML

2 verktyg

Dataserialiseringsformat

Dataserialisering är processen att konvertera strukturerad data till ett format som kan lagras eller överföras och senare rekonstrueras. Olika format gör olika avvägningar mellan läsbarhet för människor, maskinparsning, uttrycksfullhet och filstorlek. Valet av serialiseringsformat påverkar direkt hur enkelt det är att felsöka, versionsstyra och samarbeta kring konfiguration i ett team.

JSON, YAML, TOML och XML är de fyra dominerande textbaserade serialiseringsformaten inom mjukvaruutveckling. Varje format har styrkor som gör det till det bästa valet i specifika sammanhang — att förstå dessa avvägningar låter dig välja rätt format för varje uppgift. Att känna till när man ska byta format är lika viktigt som att behärska syntaxen i ett enskilt format.

JSON och YAML sida vid sida

JSON och YAML representerar samma datamodell. YAML är en strikt supermängd av JSON — varje giltigt JSON-dokument är också giltigt YAML. Nedan visas samma konfiguration uttryckt i båda formaten:

JSON
{
  "server": {
    "host": "localhost",
    "port": 8080,
    "debug": true
  },
  "database": {
    "url": "postgres://localhost/mydb",
    "pool": 10
  }
}
YAML
server:
  host: localhost
  port: 8080
  debug: true
database:
  url: postgres://localhost/mydb
  pool: 10

YAML använder indragning i stället för klamrar och hakparenteser, och utelämnar citattecken kring de flesta strängvärden. Det gör det mer kompakt och läsbart för manuellt redigerade filer, men introducerar indragningskänslighet. För maskingenerade filer och API-svar är JSON vanligtvis att föredra eftersom det inte är beroende av blanksteg för att definiera struktur.

Formatjämförelse

FormatLäsbarhetKommentarerArrayerBäst för
JSON★★★☆☆Inga kommentarerInbyggtAPI:er, datautbyte
YAML★★★★★Ja (#)InbyggtKonfigfiler, IaC
TOML★★★★☆Ja (#)InbyggtAppkonfig (Rust, Python)
XML★★☆☆☆Ja (<!-- -->)Upprepade elementDokument, SOAP, SVG

Vanliga fallgropar i YAML

YAML är kraftfullt men har välkända kantfall som överraskar utvecklare. Dessa är de vanligaste. Att känna till dem i förväg sparar tid i felsökning och minskar risken för svårspårade fel i produktion.

Norgeproblemet

Det nakna värdet 'NO' tolkas som booleskt false i YAML 1.1. Landskoder som NO (Norge), OFF, FALSE och N parsas alla som false. I YAML 1.2 är detta åtgärdat, men många parsers använder fortfarande 1.1-regler. Citera alltid tvetydiga strängar. Ett bra riktmärke är att citera alla strängvärden som innehåller bokstavskombinationer som sammanfaller med YAML:s inbyggda literaler.

Indragningskänslighet

YAML använder indragning för att definiera struktur. Ett enda extra mellanslag eller ett tabbtecken kan helt förändra innebörden i ett dokument. Tabbar är förbjudna som indragning i YAML — endast mellanslag får användas. Använd en linter som yamllint i din CI-pipeline för att fånga indragningsfel automatiskt innan de når produktion.

Implicit typtvång

Nakna värden som ser ut som tal, booleaner eller null tvingas automatiskt till rätt typ. '1.0' blir ett decimaltal och '2024-01-01' blir ett datumobjekt i vissa parsers. Citera värden du vill behålla som strängar. Det är särskilt viktigt för versionsnummer och portkonfigurationer där ett tal som tolkas som heltal kan ge oväntat beteende.

Tabbar är förbjudna

YAML-specifikationen förbjuder uttryckligen tabbtecken för indragning. Editorer som automatiskt konverterar mellanslag till tabbar kommer tyst att förstöra din YAML-fil. Konfigurera din editor att använda mellanslag i YAML-filer. I VS Code kan du ange detta per filtyp i settings.json med nyckeln `[yaml]`.

Flerradiga stränglägen

YAML har två indikatorer för flerradiga strängar: | (literalt block, bevarar radbrytningar) och > (vikt block, konverterar radbrytningar till mellanslag). Att blanda ihop dem ger tyst felaktig utdata. Kom ihåg att du kan lägga till ett avslutande bindestreck (|- eller >-) för att ta bort den sista radbrytningen, vilket är användbart när strängen ska användas direkt i ett skalkommando.

Ankar- och aliasloopar

YAML-ankare (&) och alias (*) möjliggör återanvändning av noder, vilket är kraftfullt men kan skapa cirkulära referenser som orsakar oändliga loopar eller minnesbrist i naiva parsers. Validera YAML med ankare från opålitliga källor.

Funktioner unika för YAML

Kommentarer

YAML stöder kommentarer med #-tecknet. Det är en av de största praktiska fördelarna jämfört med JSON för konfigurationsfiler — du kan dokumentera dina inställningar direkt i filen. Kommentarer kan stå på en egen rad eller efter ett värde. Det är god praxis att använda kommentarer för att förklara varför ett värde är valt, inte bara vad det är, särskilt för parametrar som timeouts och resursbegränsningar.

Ankare och alias

YAML låter dig definiera en nod en gång med &ankarnamn och återanvända den var som helst med *ankarnamn. Det eliminerar upprepning i komplexa konfigurationer. Kubernetes och Docker Compose använder ankare flitigt för delade tjänstedefinitioner. Med merge-nyckeln (<<: *ankarnamn) kan du dessutom slå ihop en refererad mappning med ytterligare nycklar, vilket ger en form av arv i konfigurationsfiler.

Flerradiga strängar

YAML stöder blockskalar med två lägen: det literala blocket (|) bevarar radbrytningar exakt som de är skrivna, vilket är användbart för skript och mallar. Det vikta blocket (>) bryter långa strängar till en enda rad, användbart för långa textbeskrivningar. Båda lägena stöder indragningsindikatorer (t.ex. |2) som låter dig styra exakt hur mycket inledande blanksteg som tas bort vid parsning.

När du behöver konvertera

CI/CD-pipelinekonfiguration

GitHub Actions, GitLab CI och CircleCI använder YAML som standardformat. När du genererar pipelinekonfigurationer programmatiskt är det ofta enklare att bygga ett JSON-objekt och konvertera till YAML för slutlig utdata. Det gör det också möjligt att använda välkända JSON-valideringsbibliotek för att kontrollera pipelinens struktur innan den skickas till versionskontrollen.

Kubernetes-manifest

Kubernetes-resurser definieras i YAML, men Helm-diagramsmallar och vissa verktyg producerar JSON. Att konvertera mellan formaten låter dig inspektera API-svar och använda vanliga JSON-verktyg. Det underlättar också diff-operationer när du jämför önskat tillstånd med faktiskt klustertillstånd via kubectl.

Bearbetning av API-svar

REST API:er returnerar JSON. När du matar in den datan i YAML-baserade konfigurationssystem (Ansible, Salt, Kubernetes) fyller en konverterare gapet utan manuell omformatering. Automatiserade konverteringar i ett skript minskar risken för mänskliga fel jämfört med att manuellt skriva om strukturen.

Konfigurationsmigrering

Att migrera från ett verktyg till ett annat innebär ofta att konvertera konfigurationsformat. Att konvertera mellan JSON och YAML låter dig snabbt flytta mellan ekosystem (Node.js → Python, Docker → Kubernetes).

Schemavalideringsflöde

JSON Schema-verktyg är mer mogna än YAML Schema. Ett vanligt mönster är att skriva konfiguration i YAML för läsbarhetens skull, konvertera till JSON för validering mot ett schema och sedan konvertera tillbaka för driftsättning.

Datautbyte med API:er

Interna verktyg kan konsumera YAML-konfigurationer medan externa API:er kräver JSON. En konverterare i byggpipelinen håller båda representationerna synkroniserade utan att behöva underhålla duplicerade filer.

Vanliga frågor

Är YAML en supermängd av JSON?

Ja. YAML 1.2 är en strikt supermängd av JSON — varje giltigt JSON-dokument är också giltigt YAML. YAML 1.1 (som fortfarande används av många parsers) har dock några kantfall där giltig JSON inte är giltig YAML 1.1. I praktiken innebär det att du bör kontrollera vilken YAML-version din parser implementerar om du förlitar dig på JSON-kompatibilitet.

Varför välja YAML framför JSON för konfigurationsfiler?

YAML stöder kommentarer, vilket JSON inte gör. YAML är också mer kompakt för djupt nästlade strukturer. Dessa två egenskaper gör det till det föredragna valet för manuellt redigerade konfigurationsfiler (Docker, Kubernetes, GitHub Actions). Dessutom gör ankar- och aliasfunktionen det enkelt att återanvända gemensamma konfigurationsblock utan upprepning.

Vad är TOML och när bör jag använda det?

TOML (Tom's Obvious Minimal Language) är utformat för konfigurationsfiler. Det har en tydlig, INI-liknande syntax med explicita typer och ingen tvetydighet. Det är standarden för Rust- (Cargo.toml) och Python- (pyproject.toml) projekt.

Kan konvertering från JSON till YAML förlora information?

Sällan, men potentiellt. JSON bevarar nyckelordning i de flesta parsers (även om specifikationen säger att det är oordnat). YAML stöder ankare och taggar som saknar JSON-motsvarighet. För fullständig roundtrip-trohet, håll dig till den gemensamma delmängden. Om du behöver bevara YAML-specifika funktioner som ankare bör du undvika att gå via JSON som mellansteg.

Vad orsakar att 'undefined' dyker upp i JSON-utdata?

JSON.stringify konverterar undefined-värden till null i arrayer och utelämnar dem från objekt. Om du ser oväntade null-värden eller saknade nycklar i JSON-utdata innehöll förmodligen källans JavaScript-objekt undefined-egenskaper. En enkel lösning är att filtrera bort undefined-egenskaper explicit innan serialisering, eller använda en replacer-funktion i JSON.stringify.

Kan jag använda JSON i en YAML-fil?

Ja. Eftersom YAML är en supermängd av JSON kan du bädda in JSON-syntax direkt i ett YAML-dokument. Det görs ibland för komplexa nästlade strukturer där YAML:s indragning skulle bli förvirrande. Det är ett praktiskt knep när du vill klistra in ett API-svar direkt i en konfigurationsfil utan att behöva konvertera syntaxen manuellt.