Formaatdocumentatie houdt van speelgoedvoorbeelden — drie rijen, nep namen, vijf kolommen. Prima voor het leren van de syntaxis, maar het vertelt je niet of een formaat de vormen aankan waarmee je op het werk daadwerkelijk te maken hebt. Dit artikel slaat het speelgoed over. Hieronder staan de datapatronen die voortdurend opduiken in echte backend-ontwikkeling — productcatalogi, auditlogs, metrieketabellen, configuratieobjecten, financiële transacties — getoond in zowel JSON als TOON naast elkaar, zodat je precies kunt zien wat je bespaart en waar TOON zijn waarde bewijst. Alle data is realistisch; geen foo, bar of tijdelijke aanduidingsnamen te bekennen. Voor achtergrondinformatie over het formaat zelf, zie de TOON-syntaxisgids.

E-commerce productcatalogus

Een productsarray is waarschijnlijk het meest voorkomende ding dat ontwikkelaars naar een LLM sturen — "classificeer deze items", "vind de goedkoopste in elke categorie", "markeer alles dat niet op voorraad is met een prijs boven $50". Hier is eerst een realistische catalogusslice in JSON:

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 dezelfde catalogus in TOON. Kolomkoppen worden één keer gedeclareerd; elke rij is gewoon waarden:

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 zes kolomkoppen in TOON worden precies één keer geschreven. In JSON herhalen ze op elke rij. Tegen rij 3 heeft de header zichzelf al terugverdiend in tokenbesparing — en op een catalogus van 200 rijen is het verschil dramatisch. Gebruik de OpenAI-tokenizer om de besparingen voor je eigen data te verifiëren.

Gebruikersactiviteit / Auditlog

Auditlogs zijn precies het soort data dat je aan een LLM zou voeden met een prompt zoals "vat samen wat deze gebruiker het afgelopen uur heeft gedaan" of "markeer verdachte toegangspatronen". Ze zijn hoogvolumig, repetitief, en de kolomnamen zijn identiek op elke rij. Auditsporen zijn ook doorgaans het eerste dat je contextvenster opblaast als je ze als JSON plakt. Hier is een realistisch 9-rijen log in 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

De equivalente JSON zou "userId", "action", "resourceId", "resourceType", "timestamp", en "ip" op alle negen rijen herhalen — 54 sleutelherhalingen voor zes veldnamen. In TOON verschijnen ze precies één keer. Voor auditlogs met honderden vermeldingen is dat het verschil tussen de data in je prompt passen of niet.

API-snelheidsbeperking / Metriekdata

Operationele metrieken — latentiepercentages, foutpercentages, doorvoer — zijn een andere natuurlijke fit voor TOON. De data is numeriek-zwaar en perfect tabulair. Je zou dit naar een LLM kunnen sturen om te vragen "welke endpoints hebben p99-latentie boven 500ms?" of "waar stijgt het foutpercentage?" Dit is de vorm van data die je typisch zou zien uit een Node.js-metriekpijplijn of een Prometheus-scrape:

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

Het LLM kan vragen over deze tabel onmiddellijk beantwoorden zonder contextoverhead. Merk op dat /api/v2/search en /api/v2/checkout beide opvallen met hoge p99 en verhoogde foutpercentages — precies het soort patroon dat een LLM direct kan signaleren wanneer je de data overzichtelijk presenteert.

Genest configuratieobject

TOON verwerkt meer dan tabulaire data. Voor gestructureerde objecten — het soort ding dat je zou vinden in een app's runtimeconfiguratie — gebruikt TOON een inline objectnotatie met geneste structuur. Zie het als een tegenhanger van serialisatieformaten zoals TOML of YAML, maar slanker. Hier is een realistische app-config met serverinstellingen, database-instellingen en feature-flags:

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
  }
}

Dezelfde config in TOON-objectnotatie — sleutels zijn niet geciteerd, nesting gebruikt inline accolades:

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}
}
TOON's objectsyntaxis citeert sleutels niet tenzij een waarde een komma of dubbele punt bevat. In het database-blok hierboven is host:db.internal.example.com prima zoals het is — geen aanhalingstekens nodig omdat de waarde geen van beide bevat. Als een waarde wel een komma of dubbele punt bevat, zet hem in dubbele aanhalingstekens: dsn:"host:5432,sslmode=require".

Financiële transacties

Financiële data is een andere hoogwaardige LLM-use case: fraudedetectietips, reconciliatiecontroles, categorisering. De mix van string-ID's, numerieke bedragen, valutacodes, statusenums en tijdstempels mapt netjes op het tabulaire formaat van TOON. Hier is een realistische transactieslice:

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

Plak dit in een prompt naast "markeer transacties boven £5.000 of met status flagged of failed" en het model antwoordt in seconden. De TOON-representatie is compact genoeg dat je comfortabel enkele honderden rijen in een enkele prompt zou passen zonder contextlimieten te bereiken bij de meeste modellen.

Tabulaire en objectdata combineren in één document

Hier is iets wat noch JSON noch CSV netjes aanpakt: een document dat zowel een metadata-header (een enkel configuratieobject) als een datatable in dezelfde payload heeft. Denk aan een rapport met een contextblok bovenaan — wie het heeft gegenereerd, welke tijdsperiode het bestrijkt, welke filters zijn toegepast — gevolgd door de eigenlijke datarijen. In JSON zou je alles moeten wikkelen in een envelop-object met een "meta"-sleutel en een "rows"-sleutel, wat nog een nestinglaag toevoegt. CSV kan het helemaal niet. TOON verwerkt het native:

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

De eerste regel is een TOON-object — de rapportmetadata. De lege regel scheidt het van de tabulaire sectie die volgt. Een enkele decode()-aanroep van @toon-format/toon retourneert beide. Je kunt dit hele document naar een LLM sturen met een vraag zoals "welke vertegenwoordigers liggen op koers om hun quota te halen?" en het heeft alles wat het nodig heeft: de rapport-context en de data, in één compacte payload.

Dit gemengde formaat is bijzonder krachtig voor LLM-pijplijnen. In plaats van een JSON-envelop met geneste sleutels te bouwen, schrijf je een plat header-object + een benoemde tabel. Het model leest het op een natuurlijke manier, en je code om het te genereren is triviaal. Gebruik de JSON naar TOON converter om bestaande JSON-payloads te transformeren, of de TOON Formatter om handgeschreven TOON op te schonen en te valideren.

Het npm-pakket gebruiken

Al deze voorbeelden kunnen programmatisch worden gecodeerd en gedecodeerd. Het @toon-format/toon-pakket is de referentie-implementatie. Installeer het in elk Node.js- of browserproject:

bash
npm install @toon-format/toon

Codeer dan je data voordat je het naar een LLM API stuurt, en decodeer het antwoord op de terugweg:

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"

Samenvatting

De bovenstaande patronen — productcatalogi, auditlogs, metrieketabellen, configuratieobjecten, financiële data, gemengde header+tabel-documenten — bestrijken de overgrote meerderheid van de gestructureerde data die ontwikkelaars daadwerkelijk naar LLMs sturen. TOON verwerkt ze allemaal goed, en de tokenbesparingen zijn in elk geval significant. De kernregel is eenvoudig: JSON herhaalt sleutelnamen op elke rij; TOON niet. Voor tabulaire dataserialisatie die in een LLM-contextvenster gaat, is die herhaling pure verspilling.

Om bestaande JSON naar TOON te converteren, gebruik de JSON naar TOON converter. Om de andere kant op te gaan nadat een LLM TOON retourneert, gebruik de TOON naar JSON converter. De TOON Formatter reinigt en valideert TOON-strings, en de TOON Validator pakt syntaxfouten op voordat ze je pijplijn bereiken. Het npm-pakket @toon-format/toon verwerkt coderen en decoderen in twee regels code — alle bovenstaande voorbeelden werken meteen.