Sia JSON che TOON rappresentano dati strutturati. Entrambi sono basati su testo. Entrambi possono descrivere oggetti, array e gerarchie annidate. Quindi se hai scoperto TOON per caso e ti sei chiesto se fosse solo un'altra alternativa a JSON che cerca di risolvere un problema che non esiste — è una domanda legittima. La risposta è: sono ottimizzati per lavori completamente diversi, e una volta che lo si vede descritto chiaramente, la scelta diventa ovvia.

JSON è il linguaggio universale dello scambio di dati. È stato la spina dorsale delle API REST per oltre un decennio, è supportato nativamente in ogni moderno linguaggio di programmazione, ed è quello a cui ci si rivolge per default. TOON è un formato più recente con una missione più ristretta: ridurre al minimo l'utilizzo di token quando si passano dati strutturati da e verso i modelli linguistici di grandi dimensioni. Stessi dati sottostanti, impronta radicalmente diversa.

Cosa rende JSON eccellente

Il superpotere di JSON è l'ubiquità. La specifica RFC 8259 è abbastanza semplice da stare in poche pagine, motivo per cui ogni linguaggio, da Python a Go a Rust, ha un parser JSON di prima classe nella sua libreria standard o ecosistema. Non è necessario installare nulla. Non è necessario spiegare il formato ai colleghi. E gli strumenti — formattatori, validatori, validatori di schema — sono universalmente disponibili.

  • Universalmente supportato. Ogni linguaggio, ogni runtime, ogni servizio cloud parla JSON nativamente.
  • Leggibile dall'uomo. Le chiavi sono stringhe quotate, la struttura è esplicita con parentesi graffe e quadre.
  • Primitivi tipizzati. Numeri, booleani, null, stringhe, array e oggetti — tutti rappresentati in modo non ambiguo.
  • Ricco ecosistema di strumenti. Linter, formattatori, validatori JSON Schema, motori di query JSONPath — l'ecosistema è enorme.
  • Standard per le API REST. Content-Type: application/json è l'aspettativa predefinita in praticamente ogni API HTTP.

Cosa rende TOON diverso

TOON è stato costruito con un vincolo specifico in mente: le finestre di contesto LLM e i costi dei token. Quando si chiama l'API OpenAI o qualsiasi altro provider LLM, si paga per token. I token non sono caratteri — sono approssimativamente frammenti di parole, e la punteggiatura strutturale di JSON (virgolette, due punti, virgole, parentesi graffe) ne consuma un numero sorprendente. Per i dati tabulari in particolare, JSON è dispendioso: ogni riga ripete ogni nome di chiave.

TOON risolve questo problema con una notazione compatta. Per i dati tabulari, le chiavi vengono dichiarate una volta in un' intestazione, e le righe sono semplici valori separati da virgole. Per singoli oggetti e array, utilizza una sintassi inline snella. Lo strumento di tokenizzazione OpenAI è utile per vedere la differenza in pratica — incolla gli stessi dati in entrambi i formati e confronta direttamente il conteggio dei token.

Confronto affiancato: dataset di 10 righe

Ecco una tabella di prodotti con 10 righe in JSON — il tipo di cosa che potresti passare a un LLM per chiedergli di analizzare i prezzi o categorizzare gli articoli:

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

Ora gli stessi dati in TOON. Le chiavi vengono dichiarate una volta nell'intestazione — le righe contengono solo valori:

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
Risparmio di token in pratica: La versione JSON sopra riportata conta circa 420 token sul tokenizzatore OpenAI. La versione TOON è di circa 195 token — meno della metà. Su larga scala (migliaia di chiamate API al giorno o dataset con centinaia di righe), quel divario diventa denaro reale.

Utilizzo di TOON in JavaScript / TypeScript

Il pacchetto npm @toon-format/toon gestisce la codifica e la decodifica. Installalo una volta e l'API è semplice:

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"

È anche possibile codificare un singolo oggetto inline. La notazione degli oggetti di TOON usa le parentesi graffe senza quotare le chiavi, e la sua notazione degli array è semplicemente valori separati da virgole tra parentesi quadre:

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

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

Quando usare TOON

  • Prompt LLM con dati strutturati. Alimentare una tabella, un elenco di record o un catalogo di prodotti in una chiamata GPT-4 / Claude / Gemini. Il risparmio di token riduce direttamente la fattura API.
  • Analisi dell'output LLM. Se si istruisce un LLM a rispondere in TOON, le risposte sono più brevi ed economiche sia per i token di input che di output.
  • Dati tabulari in particolare. La struttura intestazione-una-volta-poi-righe di TOON è notevolmente più compatta di JSON per qualsiasi cosa a forma di tabella.
  • Pipeline di elaborazione batch. Si elaborano migliaia di record attraverso un LLM ogni giorno? Anche una riduzione del 40% dei token si accumula rapidamente.
  • Pressione sulla finestra di contesto. Quando si sta raggiungendo il limite di contesto di un modello, TOON consente di inserire più dati nella stessa finestra.

Quando restare con JSON

  • API REST. Ogni client HTTP, ogni framework server, ogni gateway API parla JSON. Non rompere la convenzione.
  • File di configurazione. package.json, tsconfig.json, settings.json — JSON è lo standard per la configurazione nella maggior parte degli ecosistemi.
  • Archiviazione nel database. jsonb di PostgreSQL, documenti MongoDB, DynamoDB — questi sono nativi JSON. TOON non appartiene qui.
  • Comunicazione inter-servizi. Quando due servizi comunicano tra loro, usa JSON. È quello che comprendono gli strumenti di logging, tracing e monitoraggio.
  • API pubbliche. Se sviluppatori esterni consumano la tua API, JSON è il contratto atteso. TOON è un'ottimizzazione interna, non un formato di interfaccia pubblica.
  • Analisi nativa del browser. JSON.parse() è integrato in ogni browser. TOON richiede una libreria.

Guida alle decisioni

Una rapida checklist per risolvere la questione:

  • I dati vanno in un prompt LLM? Usa TOON.
  • L'LLM dovrebbe restituire dati strutturati? Usa TOON.
  • I dati sono tabulari (stesse chiavi su molte righe)? Considera seriamente TOON.
  • Si tratta di una richiesta o risposta API REST? Usa JSON.
  • Si tratta di un file di configurazione? Usa JSON (o YAML).
  • È archiviato in un database? Usa JSON.
  • Strumenti non-LLM consumeranno questi dati? Usa JSON.
  • Non sei sicuro che i costi dei token siano importanti per il tuo caso d'uso? Inizia con JSON, ottimizza dopo.

Strumenti utili

Se stai lavorando con entrambi i formati, questi strumenti ti faranno risparmiare tempo. Usa il convertitore da JSON a TOON per prendere i dati JSON esistenti e produrre una rappresentazione TOON compatta pronta per l'input LLM. Il convertitore da TOON a JSON va nell'altra direzione — utile quando un LLM restituisce TOON e hai bisogno di alimentare il risultato in un sistema downstream nativo JSON. Il Formattatore TOON pulisce e valida le stringhe TOON, e il Formattatore JSON rimane il punto di riferimento per abbellire i blob JSON grezzi.

Conclusioni

JSON e TOON non sono concorrenti nel senso tradizionale — si rivolgono a parti diverse del tuo stack. JSON possiede il livello API, i file di configurazione e l'archiviazione dei dati. TOON possiede il livello LLM, dove il conteggio dei token è denaro e lo spazio della finestra di contesto è prezioso. La buona notizia è che puoi usare entrambi nello stesso progetto senza attrito: archivia e trasferisci i dati come JSON, codifica in TOON immediatamente prima di qualsiasi chiamata LLM, e decodifica di nuovo in JSON o un oggetto nativo in uscita. Una volta impostato quel pattern, il risparmio di token è automatico.