Tre format går in på ett planeringsmöte. JSON säger att det kan hantera allt. CSV säger att det är snabbt och magert. TOON säger att det är här för att prata med AI:n. De har alla rätt — för olika jobb. Den frustrerande delen är inte att dessa format finns, det är att välja fel ett för ditt användningsfall kostar dig på verkliga, konkreta sätt: mångsidiga payloads, trasiga importer, dyra LLM-räkningar, eller parsningshuvudvärk. Den här guiden ger dig ett tydligt ramverk för att välja.

Ett snabbt porträtt av varje format

JSON (JavaScript Object Notation) uppstod från JavaScript i början av 2000-talet och blev det dominerande formatet för webb-API:er tack vare dess enkelhet och uttrycksfullhet. Det hanterar nästlade strukturer inbyggt, skiljer mellan strängar, tal, booleaner och nollor utan extra ceremoni, och specificeras av RFC 8259. Varje modernt språk har ett förstklassigt JSON-bibliotek.

CSV (Comma-Separated Values) är äldre än webben. Det definieras av RFC 4180 och är i princip lingua franca för platt tabelldata. Öppna vilken CSV som helst i Excel, Google Sheets, eller Numbers och det fungerar bara. För rena platta tabeller är det det mest kompakta och universellt importerbara format som finns.

TOON är ett nyare format byggt specifikt för LLM-arbetsflöden. Det hämtar inspiration från båda — som CSV använder det en rubrik-en-gång-sedan-rader-struktur för tabelldata, men som JSON kan det också koda nästlade objekt och arrayer. Hela dess design är inriktad på att minimera tokenantal när data skickas till och från stora språkmodeller.

Samma data i alla tre format

För att göra detta konkret, låt oss använda en produktkatalog som innehåller ett nästlat specs-objekt — en verklig form som meningsfullt testar alla tre formaten. Här är fyra produkter från en elektronikbutik:

JSON — uttrycksfullt, hanterar nesting naturligt, men mångsidigt för repetitiv raddata:

json
[
  {
    "id": "P001",
    "name": "Wireless Headphones",
    "category": "Audio",
    "price": 79.99,
    "inStock": true,
    "specs": { "weight": "250g", "connectivity": "Bluetooth 5.2", "battery": "30h" }
  },
  {
    "id": "P002",
    "name": "USB-C Docking Station",
    "category": "Peripherals",
    "price": 129.99,
    "inStock": true,
    "specs": { "ports": 11, "maxPower": "100W", "display": "4K@60Hz" }
  },
  {
    "id": "P003",
    "name": "Mechanical Keyboard",
    "category": "Input",
    "price": 94.99,
    "inStock": false,
    "specs": { "layout": "TKL", "switches": "Cherry MX Red", "backlight": "RGB" }
  },
  {
    "id": "P004",
    "name": "27" IPS Monitor",
    "category": "Display",
    "price": 299.99,
    "inStock": true,
    "specs": { "resolution": "2560x1440", "refreshRate": "165Hz", "panel": "IPS" }
  }
]

CSV — kompakt, Excel-vänligt, men det nästlade specs-objektet måste plattas ut. Det finns inget standardsätt att representera det, så vi förlorar antingen nesting eller manglerar det till en sträng:

text
id,name,category,price,inStock,specs_weight,specs_ports,specs_layout,specs_resolution
P001,Wireless Headphones,Audio,79.99,true,250g,,,
P002,USB-C Docking Station,Peripherals,129.99,true,,11,,
P003,Mechanical Keyboard,Input,94.99,false,,,TKL,
P004,27" IPS Monitor,Display,299.99,true,,,,2560x1440
Lägg märke till de glesa kolumnerna i CSV:en. Eftersom varje produkt har olika spec-nycklar var vi tvungna att skapa en kolumn för varje möjligt specifikationsfält — och de flesta rader är mestadels tomma. Det här är det grundläggande problemet med att använda CSV för icke-uniform nästlad data.

TOON — rubrik deklarerad en gång, rader är kompakta, nästlade objekt kodade inline:

text
products[4]{id,name,category,price,inStock,specs}:
  P001,Wireless Headphones,Audio,79.99,true,{weight:250g,connectivity:Bluetooth 5.2,battery:30h}
  P002,USB-C Docking Station,Peripherals,129.99,true,{ports:11,maxPower:100W,display:4K@60Hz}
  P003,Mechanical Keyboard,Input,94.99,false,{layout:TKL,switches:Cherry MX Red,backlight:RGB}
  P004,27" IPS Monitor,Display,299.99,true,{resolution:2560x1440,refreshRate:165Hz,panel:IPS}

Var varje format fallerar

Att förstå fellägen är lika viktigt som att känna till styrkorna.

  • JSON fallerar för tabeller. Att upprepa varje nyckelnamn på varje rad är genuint slösaktigt. Ett 1000-raders dataset där varje rad har 8 nycklar innebär att "id", "name", "price" och så vidare skrivs 1000 gånger vardera. För LLM-inmatning översätts detta direkt till tokenkostnad; för mänsklig inspektion är det bara brus.
  • CSV fallerar för nästlad data. Formatet har inget koncept av nesting. Du kan stringify ett nästlat objekt till en cell, men då måste konsumenten veta att parsa den cellen — du har bara förflyttat problemet. CSV har heller inget inbyggt typsystem: true är en sträng, 42 är en sträng, null är tvetydigt. Verktyg hanterar detta inkonsekvent.
  • TOON fallerar utanför LLM-kontexter. Det är ett nischformat med ett smalare ekosystem. Du hittar inte inbyggt TOON-stöd i PostgreSQL, i ditt REST-ramverk eller i Excel. npm-paketet täcker JavaScript/TypeScript-arbetsflöden väl, men om du sträcker dig efter TOON i ett sammanhang som inte har något med AI att göra, överengineerar du förmodligen.
  • CSV fallerar för värden som innehåller kommatecken eller nyrader. RFC 4180:s citatregler hanterar det, men många CSV-producenter och -konsumenter implementerar dem inkonsekvent. Ett produktnamn som 27" IPS Monitor, Black eller en beskrivning med radbrytningar blir ett tillförlitlighetsproblem.

Beslutsmatris

Här är en praktisk guide. Matcha din situation till lämpligt format:

  • Dina data går in i en LLM-promptTOON. Speciellt om de är tabellformat. Använd JSON till TOON för att konvertera före API-anropet.
  • Dina data kommer tillbaka från ett LLM och behöver bearbetasTOON (för utdata), sedan avkoda till JSON eller ett inbyggt objekt för nedströmsanvändning med TOON till JSON.
  • Dina data är rent platt tabellformat (samma nycklar på varje rad) och går till/från kalkylbladCSV. Det är den minsta representationen och universellt importerbar.
  • Dina data är platt tabellformat men omvandlas av kod (inte kalkylblad) → Antingen CSV eller JSON. JSON är säkrare om typer spelar roll (du vill inte ha "true" istället för true).
  • Dina data har nästlade objekt eller arrayerJSON. Kämpa inte mot CSVs platta begränsning. Om nesting går till ett LLM, koda till TOON efter att ha byggt strukturen.
  • Dina data går till ett REST API eller lagras i en databasJSON. Alltid.
  • Dina data är en konfigurationsfilJSON eller YAML. Varken CSV eller TOON hör hemma här.
  • Du behöver maximal portabilitet och en nollberoende parserJSON eller CSV. Båda har inbyggt eller nära inbyggt stöd överallt.

Använda alla tre i en pipeline

En realistisk pipeline kan använda alla tre. Föreställ dig ett e-handelsarbetsflöde som berikar produktdata med AI-genererade beskrivningar:

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

// Step 1: Products arrive as JSON from your REST API
const products = await fetch('/api/products').then(r => r.json());

// Step 2: Encode to TOON to minimise tokens before the LLM call
const toonInput = encode(products);

const response = await openai.chat.completions.create({
  model: 'gpt-4o',
  messages: [
    {
      role: 'user',
      content: `Here is our product catalogue in TOON format:\n\n${toonInput}\n\n
                For each product, write a one-sentence marketing description.
                Return results as TOON with fields: id, description`
    }
  ]
});

// Step 3: Decode the LLM's TOON response back to objects
const enriched = decode(response.choices[0].message.content);

// Step 4: Export to CSV for the marketing team's spreadsheet
const csvRows = enriched.map(row => `${row.id},"${row.description}"`);
const csv = ['id,description', ...csvRows].join('\n');

JSON för API-lagret, TOON genom LLM-lagret, CSV för det mänskligt konsumerbara utdatan. Varje format gör exakt det jobb det designades för.

Snabb verktygsreferens

Om du rör dig mellan dessa format täcker dessa verktyg vanliga konverteringar. TOON Formatter är det snabbaste sättet att validera och rensa upp TOON-strängar. JSON till TOON-konverteraren hanterar LLM-förberedelsessteget. Åt andra hållet efter att ett LLM returnerar TOON, kan TOON till CSV producera en kalkylbladsredo export direkt, och CSV till JSON är att gå till för att normalisera importer från Excel eller tredjepartsdataleverantörer. För TOON-specifika detaljer lever det officiella paketet på npm.

Sammanfattning

JSON, CSV och TOON har var och en ett tydligt domän. JSON är det universella formatet för strukturerat datautbyte — nästlat eller platt, API:er, konfiguration, lagring. CSV är det universella formatet för platt tabelldata som behöver resa mellan system och människor — kalkylblad, importer, exporter. TOON är formatet för att skicka strukturerad data genom AI-system effektivt, där varje token räknas. Misstaget de flesta utvecklare gör är att standardisera på JSON för allt inklusive LLM-prompter, eller att standardisera på CSV och sedan upptäcka nestingkrav mitt i ett projekt. Känn formen på dina data, vet vart de är på väg, och rätt format väljer sig vanligtvis självt.

För en djupare dykning i JSON vs TOON-avvägningen specifikt, kolla in TOON vs JSON-jämförelsen. För bakgrund om CSV-specifikationen och dess egenheter täcker Wikipedia-artikeln om CSV historiken och formatvariationerna väl.