Zarówno JSON, jak i TOON reprezentują dane strukturalne. Oba są tekstowe. Oba mogą opisywać obiekty, tablice i hierarchie zagnieżdżone. Więc jeśli natknąłeś się na TOON i zastanawiasz się, czy to tylko kolejna alternatywa dla JSON próbująca rozwiązać problem, który nie istnieje — to uczciwe pytanie. Odpowiedź brzmi: są zoptymalizowane do zupełnie różnych zadań i kiedy już to zobaczysz, wybór staje się oczywisty.
JSON to uniwersalny język wymiany danych. Przez ponad dekadę stanowi kręgosłup API REST, jest natywnie obsługiwany w każdym nowoczesnym języku programowania i jest tym, po co sięgasz domyślnie. TOON to nowszy format o węższej misji: minimalizowanie zużycia tokenów podczas przekazywania danych strukturalnych do i z dużych modeli językowych. Te same dane, radykalnie różne ślady.
Co sprawia, że JSON jest świetny
Supermocą JSON jest wszechobecność. Specyfikacja RFC 8259 jest wystarczająco prosta, aby zmieścić się na kilku stronach, dlatego każdy język od Pythona do Go do Rusta ma parser JSON pierwszej klasy w swojej standardowej bibliotece lub ekosystemie. Nie trzeba niczego instalować. Nie trzeba tłumaczyć formatu współpracownikom. A narzędzia — formatery, walidatory, walidatory schematów — są powszechnie dostępne.
- Powszechnie obsługiwany. Każdy język, każde środowisko uruchomieniowe, każda usługa w chmurze mówi JSON natywnie.
- Czytelny dla człowieka. Klucze to cytowane ciągi, struktura jest jawna dzięki nawiasem klamrowym i kwadratowym.
- Typowane prymitywy. Liczby, wartości logiczne, nulle, ciągi, tablice i obiekty — wszystkie jednoznacznie reprezentowane.
- Bogate narzędzia. Lintery, formatery, walidatory JSON Schema, silniki zapytań JSONPath — ekosystem jest ogromny.
- Standard API REST.
Content-Type: application/jsonto domyślne oczekiwanie w praktycznie każdym API HTTP.
Co sprawia, że TOON jest inny
TOON został zbudowany z myślą o jednym konkretnym ograniczeniu: oknach kontekstowych LLM i kosztach tokenów. Gdy wywołujesz OpenAI API lub dowolnego innego dostawcę LLM, płacisz za token. Tokeny to nie znaki — to mniej więcej fragmenty słów, a strukturalna interpunkcja JSON (cudzysłowy, dwukropki, przecinki, nawiasy) zużywa zaskakującą ich liczbę. W przypadku danych tabelarycznych JSON jest szczególnie marnotrawny: każdy wiersz powtarza każdą nazwę klucza.
TOON rozwiązuje to za pomocą kompaktowej notacji. Dla danych tabelarycznych klucze są deklarowane raz w nagłówku, a wiersze to zwykłe wartości oddzielone przecinkami. Dla pojedynczych obiektów i tablic używa zwięzłej składni inline. Narzędzie tokenizatora OpenAI jest przydatne, aby zobaczyć różnicę w praktyce — wklej te same dane w obu formatach i porównaj liczbę tokenów bezpośrednio.
Porównanie obok siebie: zbiór danych 10 wierszy
Oto tabela produktów z 10 wierszami w JSON — coś, co możesz przekazać LLM, aby poprosić go o analizę cen lub kategoryzację pozycji:
[
{"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}
]Teraz te same dane w TOON. Klucze są deklarowane raz w nagłówku — wiersze zawierają tylko wartości:
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,falseUżywanie TOON w JavaScript / TypeScript
Pakiet npm
@toon-format/toon
obsługuje kodowanie i dekodowanie. Zainstaluj go raz, a API jest proste:
npm install @toon-format/toonimport { 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"Możesz również kodować pojedynczy obiekt inline. Notacja obiektowa TOON używa nawiasów klamrowych bez cytowania kluczy, a notacja tablicowa to po prostu wartości oddzielone przecinkami w nawiasach kwadratowych:
// TOON object
{name:Alice,age:30,role:admin}
// TOON array
[1,2,3,4,5]Kiedy używać TOON
- Prompty LLM z danymi strukturalnymi. Podawanie tabeli, listy rekordów lub katalogu produktów do wywołania GPT-4 / Claude / Gemini. Oszczędności tokenów bezpośrednio redukują rachunek API.
- Parsowanie wyjść LLM. Jeśli instruujesz LLM, aby odpowiadał w TOON, odpowiedzi są krótsze i tańsze zarówno w tokenach wejściowych, jak i wyjściowych.
- Dane tabelaryczne szczególnie. Struktura TOON nagłówek-raz-potem-wiersze jest dramatycznie bardziej zwięzła niż JSON dla wszystkiego, co ma kształt tabeli.
- Pipeliny przetwarzania wsadowego. Przetwarzasz tysiące rekordów przez LLM codziennie? Nawet 40% redukcja tokenów szybko się sumuje.
- Presja okna kontekstowego. Gdy zbliżasz się do limitu kontekstu modelu, TOON pozwala zmieścić więcej danych w tym samym oknie.
Kiedy trzymać się JSON
- API REST. Każdy klient HTTP, każdy framework serwerowy, każda brama API mówi JSON. Nie łam tej konwencji.
- Pliki konfiguracyjne.
package.json,tsconfig.json,settings.json— JSON jest standardem dla konfiguracji w większości ekosystemów. - Przechowywanie w bazie danych.
jsonbPostgreSQL, dokumenty MongoDB, DynamoDB — są natywne JSON. TOON tu nie należy. - Komunikacja między usługami. Gdy dwie usługi rozmawiają ze sobą, używaj JSON. To jest to, co rozumieją Twoje narzędzia do logowania, śledzenia i monitorowania.
- Publiczne API. Jeśli zewnętrzni programiści konsumują Twoje API, JSON jest oczekiwanym kontraktem. TOON to wewnętrzna optymalizacja, a nie format interfejsu publicznego.
- Natywne parsowanie przeglądarki.
JSON.parse()jest wbudowany w każdą przeglądarkę. TOON wymaga biblioteki.
Przewodnik decyzyjny
Szybka lista kontrolna do rozstrzygnięcia pytania:
- Czy dane trafiają do promptu LLM? Używaj TOON.
- Czy LLM ma zwracać dane strukturalne? Używaj TOON.
- Czy dane są tabelaryczne (te same klucze w wielu wierszach)? Zdecydowanie rozważ TOON.
- Czy to żądanie lub odpowiedź API REST? Używaj JSON.
- Czy to plik konfiguracyjny? Używaj JSON (lub YAML).
- Czy jest przechowywane w bazie danych? Używaj JSON.
- Czy narzędzia inne niż LLM będą konsumować te dane? Używaj JSON.
- Nie jesteś pewien, czy koszty tokenów mają znaczenie w Twoim przypadku użycia? Zacznij od JSON, optymalizuj później.
Przydatne narzędzia
Jeśli pracujesz z oboma formatami, te narzędzia zaoszczędzą Ci czasu. Użyj konwertera JSON do TOON, aby wziąć istniejące dane JSON i uzyskać kompaktową reprezentację TOON gotową do wejścia LLM. Konwerter TOON do JSON działa w drugą stronę — przydatny gdy LLM zwraca TOON i musisz podać wynik do systemu downstream natywnego dla JSON. Formatter TOON oczyści i zwaliduje ciągi TOON, a Formatter JSON pozostaje narzędziem do upiększania surowych obiektów JSON.
Podsumowanie
JSON i TOON nie są konkurentami w tradycyjnym sensie — celują w różne części Twojego stosu. JSON jest właścicielem warstwy API, plików konfiguracyjnych i przechowywania danych. TOON jest właścicielem warstwy LLM, gdzie liczba tokenów to pieniądze, a przestrzeń okna kontekstowego jest cenna. Dobra wiadomość jest taka, że możesz używać obu w tym samym projekcie bez tarcia: przechowuj i przesyłaj dane jako JSON, koduj do TOON bezpośrednio przed każdym wywołaniem LLM i dekoduj z powrotem do JSON lub natywnego obiektu na wyjściu. Po skonfigurowaniu tego wzorca oszczędności tokenów są automatyczne.