Formatdokumentation älskar leksaksexempel — tre rader, falska namn, fem kolumner. Det är bra för att lära sig syntaxen, men det berättar inte om ett format hanterar de former du faktiskt har att göra med i jobbet. Den här artikeln hoppar över leksakerna. Nedan är datamönstren som dyker upp ständigt i verklig backendutveckling — produktkataloger, granskningsloggar, måtttabeller, konfigurationsobjekt, finansiella transaktioner — visade i både JSON och TOON sida vid sida, så du kan se exakt vad du sparar och var TOON tjänar sin plats. Alla data är realistiska; inga foo, bar eller platshållarnamn. För bakgrund om formatet självt, se TOON-syntaxguiden.

E-handelsproduktkatalog

En produktarray är förmodligen den enda vanligaste saken utvecklare skickar till ett LLM — "klassificera dessa artiklar", "hitta den billigaste i varje kategori", "flagga allt som inte är i lager med ett pris över 50 dollar". Här är en realistisk katalogskiva i JSON först:

json
[
  {"id":"PRD-1041","name":"Logitech MX Master 3S","sku":"LOG-MX3S-GRY","price":99.99,"inStock":true,"category":"Peripherals"},
  {"id":"PRD-1042","name":"Samsung 970 EVO Plus 1TB","sku":"SAM-970P-1TB","price":89.99,"inStock":true,"category":"Storage"},
  {"id":"PRD-1043","name":"Keychron K2 Pro","sku":"KEY-K2P-BLK","price":119.99,"inStock":false,"category":"Peripherals"},
  {"id":"PRD-1044","name":"Elgato Stream Deck MK.2","sku":"ELG-SD-MK2","price":149.99,"inStock":true,"category":"Streaming"},
  {"id":"PRD-1045","name":"WD Blue 2TB HDD","sku":"WD-BLU-2TB","price":54.99,"inStock":true,"category":"Storage"},
  {"id":"PRD-1046","name":"Razer DeathAdder V3","sku":"RZR-DAV3-BLK","price":69.99,"inStock":true,"category":"Peripherals"},
  {"id":"PRD-1047","name":"Focusrite Scarlett Solo","sku":"FOC-SC-SOLO","price":119.99,"inStock":false,"category":"Audio"}
]

Nu samma katalog i TOON. Kolumnrubriker deklareras en gång; varje rad är bara värden:

text
products[7]{id,name,sku,price,inStock,category}:
  PRD-1041,Logitech MX Master 3S,LOG-MX3S-GRY,99.99,true,Peripherals
  PRD-1042,Samsung 970 EVO Plus 1TB,SAM-970P-1TB,89.99,true,Storage
  PRD-1043,Keychron K2 Pro,KEY-K2P-BLK,119.99,false,Peripherals
  PRD-1044,Elgato Stream Deck MK.2,ELG-SD-MK2,149.99,true,Streaming
  PRD-1045,WD Blue 2TB HDD,WD-BLU-2TB,54.99,true,Storage
  PRD-1046,Razer DeathAdder V3,RZR-DAV3-BLK,69.99,true,Peripherals
  PRD-1047,Focusrite Scarlett Solo,FOC-SC-SOLO,119.99,false,Audio
De sex kolumnrubrikerna i TOON skrivs exakt en gång. I JSON upprepas de på varje rad. Vid rad 3 har rubriken redan betalat för sig i tokenbesparingar — och på en 200-radskatalog är skillnaden dramatisk. Använd OpenAI-tokeniseraren för att verifiera besparingarna för dina egna data.

Användaraktivitet / Granskningslogg

Granskningsloggar är exakt det slag av data du skulle mata till ett LLM med en prompt som "sammanfatta vad den här användaren gjorde under den senaste timmen" eller "flagga misstänkta åtkomstmönster". De är av hög volym, repetitiva, och kolumnnamnen är identiska på varje rad. Granskningsspår tenderar också att vara det första som spränger ditt kontextfönster när du klistrar in dem som JSON. Här är en realistisk 9-raders logg i TOON:

text
auditLog[9]{userId,action,resourceId,resourceType,timestamp,ip}:
  U-8821,LOGIN,,session,2024-11-14T08:02:11Z,203.0.113.47
  U-8821,VIEW,DOC-4490,document,2024-11-14T08:03:44Z,203.0.113.47
  U-8821,DOWNLOAD,DOC-4490,document,2024-11-14T08:03:51Z,203.0.113.47
  U-8821,VIEW,DOC-4491,document,2024-11-14T08:05:02Z,203.0.113.47
  U-8821,EDIT,DOC-4491,document,2024-11-14T08:07:39Z,203.0.113.47
  U-8821,SHARE,DOC-4491,document,2024-11-14T08:08:12Z,203.0.113.47
  U-8821,VIEW,USR-0055,user_profile,2024-11-14T08:09:58Z,203.0.113.47
  U-8821,VIEW,USR-0056,user_profile,2024-11-14T08:10:03Z,203.0.113.47
  U-8821,LOGOUT,,session,2024-11-14T08:11:22Z,203.0.113.47

Motsvarande JSON skulle upprepa "userId", "action", "resourceId", "resourceType", "timestamp", och "ip" på alla nio raderna — 54 nyckelupprepningar för sex fältnamn. I TOON visas de exakt en gång. För granskningsloggar med hundratals poster är det skillnaden mellan att data passar i din prompt och att det inte gör det.

API Rate Limit / Mätdata

Operationella mätvärden — latenspercentiler, felfrekvenser, genomströmning — är en annan naturlig passform för TOON. Data är numerikt tungt och perfekt tabellformat. Du kanske skickar detta till ett LLM för att fråga "vilka slutpunkter har p99-latens över 500ms?" eller "var stiger felfrekvensen?" Det här är formen av data du typiskt ser komma ut ur en Node.js-mätpipeline eller ett Prometheus-skrap:

text
apiMetrics[8]{endpoint,method,p50ms,p99ms,errorRate,callsPerDay}:
  /api/v2/products,GET,42,118,0.002,84200
  /api/v2/products/:id,GET,38,95,0.001,31500
  /api/v2/orders,POST,210,880,0.015,4800
  /api/v2/orders/:id,GET,55,201,0.003,19200
  /api/v2/cart,PUT,95,430,0.008,22100
  /api/v2/search,GET,310,1240,0.021,61000
  /api/v2/users/:id,GET,29,88,0.001,9700
  /api/v2/checkout,POST,540,2100,0.034,3200

LLM:et kan omedelbart svara på frågor om den här tabellen utan något kontextnötfall. Observera att /api/v2/search och /api/v2/checkout båda sticker ut med hög p99 och förhöjda felfrekvenser — exakt det slag av mönster ett LLM kan identifiera omedelbart när du presenterar data på ett rent sätt.

Nestat konfigurationsobjekt

TOON hanterar mer än tabelldata. För strukturerade objekt — det slag av saker du hittar i en apps körtidskonfiguration — använder TOON en inline objektnotation med nestad struktur. Tänk på det som en motpart till serialiseringsformat som TOML eller YAML, men magrare. Här är en realistisk appkonfiguration som visar serverinställningar, databasinställningar och funktionsflaggor:

json
{
  "server": {
    "host": "0.0.0.0",
    "port": 8080,
    "tlsEnabled": true,
    "requestTimeoutMs": 30000
  },
  "database": {
    "host": "db.internal.example.com",
    "port": 5432,
    "name": "commerce_prod",
    "poolSize": 20,
    "sslRequired": true
  },
  "features": {
    "newCheckoutFlow": true,
    "recommendationEngine": false,
    "darkMode": true,
    "betaDashboard": false
  }
}

Samma konfiguration i TOON-objektnotation — nycklar är ociterade, nesting använder inline klamrar:

text
{
  server:{host:0.0.0.0,port:8080,tlsEnabled:true,requestTimeoutMs:30000},
  database:{host:db.internal.example.com,port:5432,name:commerce_prod,poolSize:20,sslRequired:true},
  features:{newCheckoutFlow:true,recommendationEngine:false,darkMode:true,betaDashboard:false}
}
TOONs objektsyntax citerar inte nycklar om inte ett värde innehåller ett kommatecken eller kolon. I database-blocket ovan är host:db.internal.example.com bra som det är — inga citationstecken behövs eftersom värdet varken innehåller kommatecken eller kolon. Om ett värde innehåller ett kommatecken eller kolon, wrap:a det med dubbla citationstecken: dsn:"host:5432,sslmode=require".

Finansiella transaktioner

Finansdata är ett annat LLM-användningsfall med högt värde: bedrägeridetekteringstips, avstämningskontroller, kategorisering. Blandningen av sträng-ID:n, numeriska belopp, valutakoder, statusenums och tidsstämplar mappas rent till TOONs tabellformat. Här är en realistisk transaktionsskiva:

text
transactions[9]{txId,amount,currency,from,to,status,timestamp}:
  TXN-88201,1250.00,GBP,ACC-1041,ACC-2209,settled,2024-11-14T09:15:00Z
  TXN-88202,89.99,USD,ACC-3301,ACC-0047,settled,2024-11-14T09:16:34Z
  TXN-88203,4500.00,EUR,ACC-2001,ACC-5512,pending,2024-11-14T09:18:02Z
  TXN-88204,22.50,USD,ACC-0099,ACC-3301,settled,2024-11-14T09:21:47Z
  TXN-88205,750.00,GBP,ACC-5512,ACC-1041,failed,2024-11-14T09:25:10Z
  TXN-88206,12000.00,USD,ACC-7700,ACC-2001,pending,2024-11-14T09:28:55Z
  TXN-88207,310.00,EUR,ACC-1041,ACC-0099,settled,2024-11-14T09:31:22Z
  TXN-88208,55.00,USD,ACC-3301,ACC-7700,settled,2024-11-14T09:33:40Z
  TXN-88209,8900.00,GBP,ACC-2209,ACC-5512,flagged,2024-11-14T09:37:15Z

Klistra in detta i en prompt bredvid "flagga transaktioner över £5 000 eller med status flagged eller failed" och modellen svarar på sekunder. TOON-representationen är kompakt nog att du bekvämt skulle passa in flera hundra rader i en enda prompt utan att träffa kontextgränser på de flesta modeller.

Kombinera tabell- och objektdata i ett dokument

Här är något som varken JSON eller CSV hanterar rent: ett dokument som har både ett metadatarubrik (ett enskilt konfigurationsobjekt) och en datatabell i samma payload. Tänk på en rapport med ett kontextblock överst — vem genererade den, vilken tidsperiod den täcker, vilka filter som tillämpades — följt av de faktiska dataraderna. I JSON behöver du wrapper-a allt i ett kuvertobjekt med en "meta"-nyckel och en "rows"-nyckel, vilket lägger till ytterligare ett nestingslager. CSV kan inte göra det alls. TOON hanterar det inbyggt:

text
{report:weekly_sales,generatedAt:2024-11-14T10:00:00Z,region:EMEA,currency:EUR,generatedBy:analytics-service}

salesByRep[6]{repId,repName,deals,revenue,avgDealSize,quota}:
  REP-101,Marta Kowalski,14,84200.00,6014.28,75000
  REP-102,James Okafor,11,61500.00,5590.90,75000
  REP-103,Yuki Tanaka,18,102400.00,5688.88,90000
  REP-104,Sofia Andersen,9,47800.00,5311.11,75000
  REP-105,Liam Byrne,16,93100.00,5818.75,90000
  REP-106,Priya Nair,21,118600.00,5647.61,100000

Den första raden är ett TOON-objekt — rapportmetadata. Den tomma raden separerar det från det tabellformade avsnittet som följer. Ett enda decode()-anrop från @toon-format/toon returnerar båda. Du kan skicka hela det här dokumentet till ett LLM med en fråga som "vilka reps är på rätt spår för att nå kvoten?" och det har allt det behöver: rapport-kontexten och data, i en kompakt payload.

Det här mixade formatet är särskilt kraftfullt för LLM-pipelines. Istället för att bygga ett JSON-kuvert med nästlade nycklar skriver du ett platt rubrikobjekt + en namngiven tabell. Modellen läser det naturligt och din kod för att generera det är trivial. Använd JSON till TOON-konverteraren för att transformera befintliga JSON-payloads, eller TOON Formatter för att rensa upp och validera handskriven TOON.

Använda npm-paketet

Alla dessa exempel kan kodas och avkodas programmatiskt. @toon-format/toon-paketet är referensimplementationen. Installera det i vilket Node.js- eller webbläsarprojekt som helst:

bash
npm install @toon-format/toon

Koda sedan dina data innan du skickar dem till något LLM API och avkoda svaret på vägen tillbaka:

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

const transactions = [
  { txId: 'TXN-88201', amount: 1250.00, currency: 'GBP', from: 'ACC-1041', to: 'ACC-2209', status: 'settled', timestamp: '2024-11-14T09:15:00Z' },
  { txId: 'TXN-88202', amount: 89.99,   currency: 'USD', from: 'ACC-3301', to: 'ACC-0047', status: 'settled', timestamp: '2024-11-14T09:16:34Z' },
  // ...more rows
];

// Compact TOON string — send this to your LLM prompt
const toonPayload = encode(transactions);

// When the LLM returns TOON, decode back to a JS array
const decoded = decode(toonPayload);
console.log(decoded[0].status); // "settled"

Sammanfattning

Mönstren ovan — produktkataloger, granskningsloggar, måtttabeller, konfigurationsobjekt, finansdata, blandade rubrik+tabell-dokument — täcker den stora majoriteten av strukturerad data som utvecklare faktiskt skickar till LLM:er. TOON hanterar dem alla väl och tokenbesparingarna är avsevärda i varje fall. Grundregeln är enkel: JSON upprepar nyckelnamn på varje rad; TOON gör det inte. För tabelldataserialrering som går in i ett LLM-kontextfönster är den upprepningen rent slöseri.

För att konvertera befintlig JSON till TOON, använd JSON till TOON-konverteraren. För att gå åt andra hållet efter att ett LLM returnerar TOON, använd TOON till JSON-konverteraren. TOON Formatter rensar och validerar TOON-strängar och TOON Validator fångar syntaxfel innan de når din pipeline. npm-paketet @toon-format/toon hanterar kodning och avkodning i två rader kod — alla ovanstående exempel fungerar direkt.