Zowel JSON als TOON vertegenwoordigen gestructureerde data. Beide zijn tekstgebaseerd. Beide kunnen objecten, arrays en geneste hiërarchieën beschrijven. Dus als je toevallig TOON bent tegengekomen en je afvroeg of het gewoon een ander JSON-alternatief is dat een probleem probeert op te lossen dat niet bestaat — dat is een eerlijke vraag. Het antwoord is: ze zijn geoptimaliseerd voor totaal verschillende taken, en als je het eenmaal ziet uitgelegd, wordt de keuze vanzelfsprekend.

JSON is de universele taal van data-uitwisseling. Het is al meer dan een decennium de ruggengraat van REST API's, wordt native ondersteund in elke moderne programmeertaal, en is wat je standaard gebruikt. TOON is een nieuwer formaat met een kleinere missie: het tokengebruik minimaliseren wanneer je gestructureerde data heen en weer stuurt naar grote taalmodellen. Dezelfde onderliggende data, radicaal andere footprint.

Wat JSON geweldig maakt

Het superkracht van JSON is alomtegenwoordigheid. De RFC 8259-specificatie is eenvoudig genoeg om op een paar pagina's te passen, waardoor elke taal van Python tot Go tot Rust een eersteklas JSON-parser heeft in zijn standaardbibliotheek of ecosysteem. Je hoeft niets te installeren. Je hoeft het formaat niet aan je collega's uit te leggen. En tooling — formatters, validators, schemavalidators — is universeel beschikbaar.

  • Universeel ondersteund. Elke taal, elke runtime, elke cloudservice spreekt JSON native.
  • Leesbaar voor mensen. Sleutels zijn geciteerde strings, structuur is expliciet met accolades en haken.
  • Getypeerde primitieven. Getallen, booleans, nulls, strings, arrays en objecten — allemaal ondubbelzinnig weergegeven.
  • Rijke tooling. Linters, formatters, JSON Schema-validators, JSONPath-query-engines — het ecosysteem is enorm.
  • REST API-standaard. Content-Type: application/json is de standaardverwachting in vrijwel elke HTTP-API.

Wat TOON anders maakt

TOON is gebouwd met één specifieke beperking in gedachten: LLM-contextvensters en tokenkosten. Wanneer je de OpenAI API of een andere LLM-provider aanroept, betaal je per token. Tokens zijn geen tekens — het zijn ruwweg woordfragmenten, en JSON's structurele interpunctie (aanhalingstekens, dubbele punten, komma's, accolades) verbruikt er verrassend veel van. Voor tabulaire data in het bijzonder is JSON verspillend: elke rij herhaalt elke sleutelnaam.

TOON lost dit op met een compacte notatie. Voor tabulaire data worden sleutels één keer gedeclareerd in een header, en rijen zijn gewone door komma's gescheiden waarden. Voor enkele objecten en arrays gebruikt het een slanke inline syntaxis. De OpenAI tokenizer is een handig hulpmiddel om het verschil in de praktijk te zien — plak dezelfde data in beide formaten en vergelijk het aantal tokens direct.

Naast elkaar: 10-rijen dataset

Hier is een producttabel met 10 rijen in JSON — het soort ding dat je aan een LLM zou doorgeven om prijzen te analyseren of items te categoriseren:

json
[
  {"id": 1,  "name": "Wireless Mouse",      "category": "Electronics", "price": 29.99, "inStock": true},
  {"id": 2,  "name": "USB-C Hub",           "category": "Electronics", "price": 49.99, "inStock": true},
  {"id": 3,  "name": "Mechanical Keyboard", "category": "Electronics", "price": 89.99, "inStock": false},
  {"id": 4,  "name": "Monitor Stand",       "category": "Furniture",   "price": 39.99, "inStock": true},
  {"id": 5,  "name": "Webcam HD",           "category": "Electronics", "price": 69.99, "inStock": true},
  {"id": 6,  "name": "Desk Mat",            "category": "Accessories", "price": 19.99, "inStock": true},
  {"id": 7,  "name": "Laptop Stand",        "category": "Furniture",   "price": 34.99, "inStock": false},
  {"id": 8,  "name": "LED Desk Lamp",       "category": "Furniture",   "price": 44.99, "inStock": true},
  {"id": 9,  "name": "Cable Organiser",     "category": "Accessories", "price": 14.99, "inStock": true},
  {"id": 10, "name": "Headphone Hook",      "category": "Accessories", "price": 12.99, "inStock": false}
]

Nu dezelfde data in TOON. Sleutels worden één keer gedeclareerd in de header — rijen bevatten alleen waarden:

text
products[10]{id,name,category,price,inStock}:
  1,Wireless Mouse,Electronics,29.99,true
  2,USB-C Hub,Electronics,49.99,true
  3,Mechanical Keyboard,Electronics,89.99,false
  4,Monitor Stand,Furniture,39.99,true
  5,Webcam HD,Electronics,69.99,true
  6,Desk Mat,Accessories,19.99,true
  7,Laptop Stand,Furniture,34.99,false
  8,LED Desk Lamp,Furniture,44.99,true
  9,Cable Organiser,Accessories,14.99,true
  10,Headphone Hook,Accessories,12.99,false
Tokenbesparing in de praktijk: De JSON-versie hierboven telt ruwweg 420 tokens op de OpenAI-tokenizer. De TOON-versie is ongeveer 195 tokens — minder dan de helft. Op schaal (duizenden API-aanroepen per dag, of datasets met honderden rijen) wordt dat verschil echt geld.

TOON gebruiken in JavaScript / TypeScript

Het @toon-format/toon npm-pakket behandelt coderen en decoderen. Installeer het één keer en de API is eenvoudig:

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

const products = [
  { id: 1, name: 'Wireless Mouse', category: 'Electronics', price: 29.99, inStock: true },
  { id: 2, name: 'USB-C Hub',      category: 'Electronics', price: 49.99, inStock: true },
  // ...more rows
];

// Encode to TOON before sending to an LLM
const toonString = encode(products);
// products[2]{id,name,category,price,inStock}:
//   1,Wireless Mouse,Electronics,29.99,true
//   2,USB-C Hub,Electronics,49.99,true

// Decode TOON back to a plain JS array when the LLM returns it
const decoded = decode(toonString);
console.log(decoded[0].name); // "Wireless Mouse"

Je kunt ook een enkel object inline coderen. TOON's objectnotatie gebruikt accolades zonder sleutels te citeren, en zijn arraynotatie is gewoon door komma's gescheiden waarden tussen vierkante haken:

text
// TOON object
{name:Alice,age:30,role:admin}

// TOON array
[1,2,3,4,5]

Wanneer TOON gebruiken

  • LLM-prompts met gestructureerde data. Een tabel, lijst met records of productcatalogus in een GPT-4 / Claude / Gemini-aanroep voeden. De tokenbesparing verlaagt direct je API-rekening.
  • LLM-uitvoerparsering. Als je een LLM instrueert om in TOON te antwoorden, zijn de antwoorden korter en goedkoper op zowel invoer- als uitvoertokens.
  • Tabulaire data specifiek. TOON's header-één-keer-dan-rijen-structuur is dramatisch compacter dan JSON voor alles met een tabelachtige vorm.
  • Batchverwerkingspijplijnen. Elke dag duizenden records door een LLM laten lopen? Zelfs een verlaging van 40% in tokens telt snel op.
  • Contextvensterdruk. Wanneer je tegen de contextlimiet van een model aanzit, laat TOON je meer data in hetzelfde venster passen.

Wanneer bij JSON blijven

  • REST API's. Elke HTTP-client, elk serverframework, elke API-gateway spreekt JSON. Breek de conventie niet.
  • Configuratiebestanden. package.json, tsconfig.json, settings.json — JSON is de standaard voor configuratie in de meeste ecosystemen.
  • Databaseopslag. PostgreSQL's jsonb, MongoDB-documenten, DynamoDB — deze zijn JSON-native. TOON hoort hier niet thuis.
  • Inter-servicecommunicatie. Wanneer twee services met elkaar communiceren, gebruik JSON. Dat is wat je logging-, tracing- en monitoringtools begrijpen.
  • Publieke API's. Als externe ontwikkelaars je API consumeren, is JSON het verwachte contract. TOON is een interne optimalisatie, geen publiek interfaceformaat.
  • Browsernatieve parsing. JSON.parse() is ingebouwd in elke browser. TOON vereist een bibliotheek.

Beslissingsgids

Een snelle checklist om de vraag te beantwoorden:

  • Gaat de data in een LLM-prompt? Gebruik TOON.
  • Wordt van het LLM verwacht dat het gestructureerde data retourneert? Gebruik TOON.
  • Is de data tabulair (dezelfde sleutels over veel rijen)? Overweeg sterk TOON.
  • Is dit een REST API-verzoek of -antwoord? Gebruik JSON.
  • Is dit een configuratiebestand? Gebruik JSON (of YAML).
  • Wordt dit opgeslagen in een database? Gebruik JSON.
  • Zal niet-LLM-tooling deze data consumeren? Gebruik JSON.
  • Weet je niet zeker of tokenkosten van belang zijn voor jouw gebruiksscenario? Begin met JSON, optimaliseer later.

Handige tools

Als je met beide formaten werkt, besparen deze tools je tijd. Gebruik de JSON naar TOON converter om bestaande JSON-data te nemen en een compacte TOON-representatie te produceren die klaar is voor LLM-invoer. De TOON naar JSON converter gaat de andere kant op — handig wanneer een LLM TOON retourneert en je het resultaat in een JSON-native downstream-systeem moet voeden. De TOON Formatter ruimt TOON-strings op en valideert ze, en de JSON Formatter blijft de go-to voor het opschonen van ruwe JSON-blobs.

Samenvatting

JSON en TOON zijn geen concurrenten in de traditionele zin — ze richten zich op verschillende delen van je stack. JSON bezit de API-laag, configuratiebestanden en gegevensopslag. TOON bezit de LLM-laag, waar tokenaantal geld is en contextvensterruimte kostbaar is. Het goede nieuws is dat je beide kunt gebruiken in hetzelfde project zonder wrijving: bewaar en transporteer data als JSON, codeer naar TOON onmiddellijk voor elke LLM-aanroep, en decodeer terug naar JSON of een native object bij uitgang. Zodra je dat patroon hebt opgezet, zijn de tokenbesparingen automatisch.