YAML och TOON beskrivs båda som "mer läsbara än JSON" — och den beskrivningen är tekniskt sann för båda, vilket gör den oanvändbar. Den verkliga frågan är: läsbar för vem och för vilket ändamål? YAML är optimerat för mänsklig redigering: kommentarer, ankare, flerradiga strängar, indragning som speglar hur utvecklare tänker om konfiguration. TOON är optimerat för maskinbearbetning: minimala tokens, ingen tvetydighet, ingen syntax som finns enbart för mänsklig komfort. Det är olika jobb. Att blanda ihop dem leder till YAML i LLM-prompter — vilket är sämre än JSON — och TOON i Kubernetes-manifest, som ingen vill handredigera. Den här artikeln drar linjen tydligt.

YAML på två meningar

YAML är ett mänskovänligt dataserialiseringsformat designat för konfigurationsfiler, CI/CD-pipelines och strukturerade dokument som en utvecklare läser, skriver och underhåller för hand. Dess definierande funktioner — inline-kommentarer, ankar/alias DRY-mekanik, flerradiga stränglit-eraler och indragningsbaserad struktur — finns alla för att göra formatet trevligt för människor, inte effektivt för maskiner.

De kanoniska användningsfallen är GitHub Actions-arbetsflöden, Kubernetes-manifest, Docker Compose-filer och appkonfiguration som levereras tillsammans med kod. Om en människa förväntas öppna filen och redigera den, är YAML ett starkt val. YAML 1.2-specifikationen formaliserade ett antal kantfall som plågade YAML 1.1 — mest ökänt Norge-problemet, där landskoden NO parsades som boolean false i YAML 1.1-parsers. Moderna parsers som riktar in sig på YAML 1.2 hanterar detta korrekt, men det är en användbar påminnelse om att YAMLs uppenbara enkelhet döljer verklig parserkomplexitet.

  • Kommentarer. # detta är en kommentar — YAML stöder inline och hel-rad-kommentarer. Detta ensamt gör det till rätt val för vilken konfiguration som helst som en människa underhåller.
  • Ankare och alias. Definiera ett block en gång med &anchor, återanvänd det var som helst med *alias. Viktigt för DRY Kubernetes-konfigurationer och multi-miljö CI-pipelines.
  • Flerradiga strängar. Literal (|) och vikta (>) blockskalärer låter dig bädda in skalskript, SQL-frågor eller certifikatdata rent inuti en YAML-fil.
  • Läsbar indragning. Struktur definieras av tomt utrymme, som naturligt mappar till hur utvecklare tänker om nästlade konfigurationshierarkier.
  • Svagheter. Indragningskänslighet innebär att ett felvalt mellanslag är ett parsningsfel. Tabulatortecken är förbjudna. YAML 1.1 boolean-konvertering (Norge-problemet, yes/no, on/off) har orsakat verkliga produktionsbuggar. Tabelldata uttryckt som en array av objekt är mer mångsidigt än ens JSON.

TOON på två meningar

TOON är ett kompakt serialiseringsformat designat för att skicka strukturerad data till och från stora språkmodeller, där varje token kostar pengar och kontextfönsterutrymme är ändligt. Dess nyckelinnovation är tabellnotation: för dataset där varje post delar samma fält, deklareras nycklar en gång i en rubrik och utelämnas från varje efterföljande rad — vilket är motsatsen till vad JSON och YAML gör.

TOON är inte ett konfigurationsformat och var aldrig tänkt att vara det. Det finns ingen kommentarsyntax. Det finns inga ankare. Du skulle inte vilja handredigera ett 500-raders TOON-dataset mer än du skulle vilja handredigera en binär fil. Vad TOON ger dig är ett format som kodar samma information som JSON i avsevärt färre tokens — och färre tokens innebär lägre API-kostnader, effektivt större dataset per prompt och mindre tryck på kontextfönstergränser. OpenAI-tokeniseraren är det snabbaste sättet att se detta i praktiken: klistra in samma dataset i båda formaten och jämföra.

  • Tabellnotation. name[count]{col1,col2,...}: följt av en rad värden per rad. Nycklar visas exakt en gång oavsett radantal.
  • Objektnotation. {key:value,key2:value2} — inga citationstecken på nycklar, inget extra tomt utrymme.
  • Entydig parsning. Ingen boolean-konvertering, ingen indragningskänslighet, ingen spec-versionsavvikelse.
  • Ingen kommentarsyntax. TOON har inget mekanisme för inline-kommentarer — avsiktligt. Det är ett dataformat, inte ett dokumentformat.
  • Svagheter. Nischverktyg, ingen mänsklig redigeringsstory, inte lämplig för någon fil en utvecklare direkt kommer att öppna och redigera.

Sida vid sida: Samma data i varje formats element

Den mest ärliga jämförelsen visar varje format göra det det faktiskt är bra på — inte tvinga en direkt konfrontation där ett är tydligt fel verktyg.

Först ett Kubernetes Deployment-manifest. Det här är YAMLs hemmaterräng: en mänskligt underhållen konfigurationsfil med kommentarer, ankare för delade värden och djup nesting som mappar till den logiska hierarkin hos ett Kubernetes-objekt:

yaml
# Deployment manifest for the payments-service
apiVersion: apps/v1
kind: Deployment
metadata:
  name: payments-service
  namespace: production
  labels:
    app: payments-service
    version: "2.4.1"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: payments-service
  template:
    metadata:
      labels:
        app: payments-service
    spec:
      containers:
        - name: payments-service
          image: registry.example.com/payments-service:2.4.1
          ports:
            - containerPort: 8080
          env:
            - name: DB_HOST
              valueFrom:
                secretKeyRef:
                  name: payments-db-secret
                  key: host
            - name: LOG_LEVEL
              value: "info"
          resources:
            requests:
              cpu: "250m"
              memory: "256Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"

Att skriva det i TOON vore meningslöst — det är inte tabelldata, det redigeras av människor och det drar nytta av kommentarer som förklarar icke-uppenbara värden. YAML är rätt verktyg här och det finns ingen tävlan.

Nu samma data på TOONs hemmaterräng: ett användardataset som skickas till ett LLM för analys. Det här är där TOONs tabellnotation gör arbetet:

text
users[12]{id,email,plan,mrr,country,signupDate,churned}:
  1001,[email protected],pro,99.00,US,2024-01-15,false
  1002,[email protected],starter,19.00,GB,2024-02-03,false
  1003,[email protected],enterprise,499.00,DE,2023-11-20,false
  1004,[email protected],pro,99.00,CA,2024-03-10,true
  1005,[email protected],starter,19.00,AU,2024-01-28,false
  1006,[email protected],pro,99.00,US,2023-12-05,false
  1007,[email protected],enterprise,499.00,FR,2024-02-14,false
  1008,[email protected],starter,19.00,IN,2024-03-22,true
  1009,[email protected],pro,99.00,US,2024-01-09,false
  1010,[email protected],enterprise,499.00,JP,2023-10-31,false
  1011,[email protected],starter,19.00,BR,2024-04-01,false
  1012,[email protected],pro,99.00,US,2024-02-19,true

Att skriva det som YAML — en array med 12 objekt, vart och ett med 7 nycklar — skulle upprepa alla 7 nyckelnamn 12 gånger. Det är 84 nyckeldeklarationer för 84 värden. TOON deklarerar varje nyckel en gång.

Var YAML slår TOON varje gång

Vilken fil som helst som en människa kommer att öppna, läsa och redigera tillhör YAML (eller JSON för enklare fall). De avgörande fördelarna är kommentarer och ankare — två funktioner TOON helt enkelt inte har.

  • CI/CD-pipelines. GitHub Actions, GitLab CI, CircleCI — alla YAML-inbyggda. Möjligheten att kommentera ut ett steg under felsökning är genuint användbar.
  • Kubernetes och Helm. Varje manifest, varje values-fil, varje chart-mall. YAML-ankarsystemet används aktivt i komplexa Helm-charts för att undvika att upprepa miljökonfigurationer.
  • Docker Compose. Flertjänstdefinitioner med kommentarer som förklarar icke-uppenbara portbindningar, volymmonteringar och nätverkskonfigurationer.
  • Appkonfigurationsfiler. pyproject.toml-stilskonfigurationer, applikationsinställningar, funktionsflaggor med förklarande kommentarer inline.
  • Vilken fil som helst i versionskontroll som människor granskar i PR:er. Kommentarer i YAML-konfiguration är en del av dokumentationen. TOON kan inte delta i det arbetsflödet alls.
Notera om ankare: YAML-ankare (&anchor) och alias (*alias) är underutnyttjade men kraftfulla. En Kubernetes-konfiguration som delar samma miljövariabler över flera behållare kan definiera dem en gång med &common-env och referera blocket med *common-env — hålla filen DRY utan någon mallmotor. TOON har inget motsvarande mekanisme.

Var TOON slår YAML varje gång

All data som genereras programmatiskt och skickas till ett LLM tillhör TOON. YAML är faktiskt sämre än JSON för det här användningsfallet — dess indragningstunga syntax och upprepade nyckelnamn lägger till tokens utan att lägga till information som modellen behöver.

  • LLM-promptpayloads. Mata ett dataset till GPT-4o, Claude eller Gemini för analys, klassificering eller berikning. TOONs tabellnotation minskar tokenantalet med 40–60% jämfört med JSON, och jämfört med YAML är klyftan ännu större.
  • LLM-utdatainstruktioner. Att instruera en modell att svara i TOON producerar kortare, billigare utdata. YAML-utdata från ett LLM är mångsidigt och indragningskänsligt — ett feljusterat mellanslag och parsningen går sönder.
  • Programmatiskt genererade dataset. Om din kod bygger datan bör den bygga TOON. Det finns ingen mänsklig redaktör som drar nytta av kommentarer eller läsbar indragning.
  • Batchpipelines med hög volym. Kör 10 000 poster genom ett LLM per dag? En 50% tokenreduktion är en 50% minskning av den raden i din API-räkning.
  • Kontextfönsterstryck. När du behöver passa in mer data inom en modells kontextgräns, låter TOON dig packa in fler rader vid samma tokenkostnad.

Tokenantalets verklighet

Här är samma 10-raders dataset i tre format. Siffrorna är ungefärliga men konsistenta med vad OpenAI-tokeniseraren rapporterar för GPT-4o:s tokenisering.

YAML-array av objekt:

yaml
- id: 1
  username: alice_chen
  plan: pro
  mrr: 99.00
  country: US
- id: 2
  username: bob_martin
  plan: starter
  mrr: 19.00
  country: GB
- id: 3
  username: carol_white
  plan: enterprise
  mrr: 499.00
  country: DE
- id: 4
  username: dan_patel
  plan: pro
  mrr: 99.00
  country: CA
- id: 5
  username: eve_torres
  plan: starter
  mrr: 19.00
  country: AU
- id: 6
  username: frank_liu
  plan: pro
  mrr: 99.00
  country: US
- id: 7
  username: grace_kim
  plan: enterprise
  mrr: 499.00
  country: FR
- id: 8
  username: henry_obi
  plan: starter
  mrr: 19.00
  country: IN
- id: 9
  username: iris_novak
  plan: pro
  mrr: 99.00
  country: US
- id: 10
  username: james_sato
  plan: enterprise
  mrr: 499.00
  country: JP

TOON-tabellnotation, samma data:

text
users[10]{id,username,plan,mrr,country}:
  1,alice_chen,pro,99.00,US
  2,bob_martin,starter,19.00,GB
  3,carol_white,enterprise,499.00,DE
  4,dan_patel,pro,99.00,CA
  5,eve_torres,starter,19.00,AU
  6,frank_liu,pro,99.00,US
  7,grace_kim,enterprise,499.00,FR
  8,henry_obi,starter,19.00,IN
  9,iris_novak,pro,99.00,US
  10,james_sato,enterprise,499.00,JP
Ungefärliga tokenantal för detta dataset: YAML ≈ 290 tokens. JSON (motsvarig array av objekt) ≈ 230 tokens. TOON ≈ 115 tokens. YAML är inte bara sämre än TOON — det är sämre än JSON för tabelldata, eftersom dess indragnings-syntax lägger till tokens som JSONs klamrar inte gör. TOON vinner med ungefär 2,5× över YAML och 2× över JSON på den här formen av data. Verifiera med OpenAI-tokeniseraren.

Anledningen till att YAML presterar sämre än JSON på tabelldata är strukturell: YAML använder en rad per nyckel-värde-par med indragning, så ett 5-fältsobjekt kostar 5 rader plus listmarkören. JSON wrapper åtminstone hela objektet i ett set klamrar. TOON eliminerar nyckelupprepning helt — nycklar visas en gång, värden packas in i rader. Besparingarna ökar med radantal och fältantal.

Använda TOON i din kod

Paketet @toon-format/toon hanterar kodning och avkodning:

bash
npm install @toon-format/toon
ts
import { encode, decode } from '@toon-format/toon';

// Your dataset — could come from a database query, API response, anywhere
const users = [
  { id: 1001, email: '[email protected]', plan: 'pro',        mrr: 99.00,  country: 'US' },
  { id: 1002, email: '[email protected]',   plan: 'starter',    mrr: 19.00,  country: 'GB' },
  { id: 1003, email: '[email protected]', plan: 'enterprise', mrr: 499.00, country: 'DE' },
  // ...more rows
];

// Encode to TOON before inserting into your LLM prompt
const toonPayload = encode(users);
// users[3]{id,email,plan,mrr,country}:
//   1001,[email protected],pro,99.00,US
//   1002,[email protected],starter,19.00,GB
//   1003,[email protected],enterprise,499.00,DE

const prompt = `Analyse this user dataset and identify churn risk signals.
Return your findings as a TOON dataset with columns: id, riskScore, reason.

Dataset:
${toonPayload}`;

// After the LLM responds with TOON output, decode it back
const llmResponse = '...'; // TOON string from the model
const findings = decode(llmResponse);
console.log(findings[0]); // { id: 1001, riskScore: 'low', reason: 'Active, pro plan' }

Beslutsguide

Valet mellan YAML och TOON är nästan aldrig tvetydigt i praktiken:

  • Använd YAML om en människa ska läsa eller redigera filen — CI/CD-pipelines, Kubernetes-manifest, Docker Compose, appkonfiguration, Ansible-playbooks.
  • Använd YAML om du behöver inline-kommentarer för att förklara icke-uppenbara värden.
  • Använd YAML om du behöver ankare och alias för att hålla en komplex konfiguration DRY.
  • Använd YAML om du arbetar med ett verktyg som förväntar sig YAML enligt konvention (Helm, GitHub Actions, k8s kubectl apply).
  • Använd TOON om data går in i en LLM-prompt — speciellt tabelldata med flera rader.
  • Använd TOON om du ber ett LLM att returnera strukturerad data och du vill ha kortare, billigare utdata.
  • Använd TOON om tokenantal spelar roll — pipelines med hög volym, långa dataset, kontextfönsterstryck.
  • Använd TOON om data genereras programmatiskt och ingen människa redigerar det direkt.
  • Använd JSON (inte YAML eller TOON) om du bygger ett REST API, lagrar data i en databas eller integrerar med tredjepartsverktyg som förväntar sig JSON.

Sammanfattning

YAML och TOON upptar helt olika positioner i ditt stack. YAML tillhör ditt arkiv bredvid din kod — konfigurationsfiler, pipelinedefinitioner, infrastrukturmanifest. TOON tillhör gränsen mellan din applikation och LLM API:er, där det konverterar din strukturerade data till den mest tokeneffektiva representationen innan sändning och konverterar modellens svar tillbaka på vägen ut. Det finns ingen meningsfull överlappning mellan dessa jobb, vilket är varför frågan inte är "vilken är bättre" utan "vilken hör hemma här".

Om du arbetar med TOON är TOON Formatter och TOON Validator det snabbaste sättet att inspektera och verifiera TOON-strängar. JSON till TOON-konverteraren konverterar befintliga JSON-payloads till TOON för LLM-användning, och TOON till JSON-konverteraren hanterar returresan när en modell svarar i TOON och ditt nedströmssystem förväntar sig JSON. Se även Wikipedia-artikeln om YAML för en kortfattad historia av formatet och en sammanfattning av dess kända kantfall.