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:
[
{"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:
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,AudioGebruikersactiviteit / 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:
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.47De 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:
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,3200Het 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:
{
"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:
{
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}
}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:
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:15ZPlak 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:
{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,100000De 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.
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:
npm install @toon-format/toonCodeer dan je data voordat je het naar een LLM API stuurt, en decodeer het antwoord op de terugweg:
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.