CSV og JSON er sannsynligvis de to vanligste dataformatene du vil møte som utvikler. CSV-filer dukker opp i regnearkeksporter, database-dumps og datavitenskap-pipeliner. JSON er overalt på nettet — REST API-er, konfigurasjonsfiler, NoSQL-databaser. Begge er ren tekst, begge er menneskelesbare, og begge får jobben gjort. Men de er bygget for forskjellige former for data, og å velge feil ett skaper reelle hodepiner. Denne artikkelen gjennomgår kjernforskjellene, viser deg konkrete eksempler på hvor hvert format skinner (og bryter ned), og gir deg en praktisk beslutningsguide for å velge mellom dem.

Kjernforskjellen: Tabeller vs Trær

CSV — definert i RFC 4180 — er et flatt, tabellformet format. Alle rader har de samme kolonnene, alle verdier er strenger. Det er alt. Det kartlegger perfekt til et regneark eller en databasetabell: rader nedover, kolonner bortover.

JSON — spesifisert i RFC 8259 og beskrevet på json.org — er et hierarkisk format. Verdier kan være objekter, matriser, strenger, tall, booleaner eller null. Objekter nestes inne i objekter, matriser inneholder forskjellige former. Det kartlegger til hvordan data faktisk lever i kode — poster med relasjoner, lister med forskjellige ting, typede verdier.

Ettlinjesoppsummering: CSV er en tabell. JSON er et tre. Hvis dataene dine er en tabell, er CSV enklere og mindre. Hvis dataene dine har noe nesting, vil CSV enten miste informasjon eller tvinge deg inn i smertefulle løsninger.

De Samme Dataene i Begge Formater

Her er hvor forskjellen blir konkret. Se for deg en produktkatalog for en nettbutikk. Produkter har et navn, en pris og om de er på lager — rett fram. Men de har også varianter (størrelser, farger) og attributter (materiale, vekt). La oss se hvordan disse dataene ser ut i begge formater.

I JSON er dette naturlig:

json
[
  {
    "id": "SHOE-001",
    "name": "Trail Runner Pro",
    "price": 129.99,
    "inStock": true,
    "attributes": {
      "material": "mesh",
      "weightGrams": 280
    },
    "variants": [
      { "size": 9,  "color": "black", "sku": "TR-9-BLK",  "qty": 12 },
      { "size": 9,  "color": "white", "sku": "TR-9-WHT",  "qty": 4  },
      { "size": 10, "color": "black", "sku": "TR-10-BLK", "qty": 7  }
    ]
  },
  {
    "id": "SHOE-002",
    "name": "City Walker",
    "price": 89.99,
    "inStock": true,
    "attributes": {
      "material": "leather",
      "weightGrams": 340
    },
    "variants": [
      { "size": 8,  "color": "brown", "sku": "CW-8-BRN",  "qty": 6  },
      { "size": 9,  "color": "brown", "sku": "CW-9-BRN",  "qty": 15 }
    ]
  }
]

Prøv nå å legge det inn i en CSV. Du har to alternativer, begge er vanskelige. Alternativ én: flat alt og gjenta overordnede data for hver variantrad:

csv
product_id,product_name,price,inStock,material,weightGrams,variant_size,variant_color,sku,qty
SHOE-001,Trail Runner Pro,129.99,true,mesh,280,9,black,TR-9-BLK,12
SHOE-001,Trail Runner Pro,129.99,true,mesh,280,9,white,TR-9-WHT,4
SHOE-001,Trail Runner Pro,129.99,true,mesh,280,10,black,TR-10-BLK,7
SHOE-002,City Walker,89.99,true,leather,340,8,brown,CW-8-BRN,6
SHOE-002,City Walker,89.99,true,leather,340,9,brown,CW-9-BRN,15

Produktnavnet, prisen og attributtene gjentas for hver variant. Det er dataredundans — ikke et stort problem for fem rader, men for en katalog med 50 000 produkter med 8 varianter hver, legger det opp. Alternativ to: serialiser variantene som en JSON-streng inne i en CSV-kolonne — men nå bygger du inn JSON inne i CSV for å jobbe rundt CSVs begrensninger, som er en kodelukt hvis jeg noen gang har sett en.

Hvor CSV Vinner

Til tross for den begrensningen er CSV genuint det bedre valget i flere vanlige scenarier.

  • Regneark og BI-verktøy. Excel, Google Sheets, Tableau, Looker, Power BI — de åpner alle CSV nativt med ett klikk. Ingen importveiviser, ingen skjema å definere, inget transformasjonstrinn. Hvis interessentene dine lever i regneark, er CSV veien med minst motstand.
  • Rent flate data. Hvis dataene dine genuint er en tabell — analysehendelser, transaksjonslogger, sensoravlesninger, brukereksport — er CSV mindre og enklere. Ingen gjentatte nøkler, ingen parenteser, ingen støy.
  • Database-import/eksport. Alle SQL-databaser har en COPY FROM CSV eller tilsvarende kommando. Det er standard utvekslingsformat for bulk-datalasting og er størrelsesordener raskere enn INSERT-setninger.
  • pandas og datavitenskap. pandas.read_csv() er en av de mest brukte funksjonene i Python-dataarbeid. Hele økosystemet — NumPy, scikit-learn, Polars — behandler CSV som et førsteklasses inngangsformat.
  • Filstørrelse for store flate tabeller. Uten nøkkelnavn på hver rad er CSV mindre for brede tabeller med mange rader. En million-rads CSV med analysehendelser vil komfortabelt slå det tilsvarende JSON-matrisen.

Hvor JSON Vinner

  • Nestede og hierarkiske data. Så snart dataene dine har noen struktur utover en flat tabell — nestede objekter, matriser med forskjellige former, relaterte poster — håndterer JSON det naturlig. CSV kan ikke representere dette uten å miste informasjon eller skape redundans.
  • Typepreservering. I CSV er alt en streng. true, 42, null og "true" ser alle like ut. Du må utlede typer på mottakersiden, noe som fører til feil. JSON har native booleaner, tall og null. inStock: true er utvetydig en boolsk — ingen gjetning nødvendig.
  • REST API-er og nettet. JSON er det native dataformatet for nettet. Alle HTTP-klientbiblioteker, alle nettleseres Fetch API, alle REST- og GraphQL API-er snakker JSON. Å sende CSV over HTTP er mulig men uvanlig — du trenger tilpasset parsing på begge sider.
  • NoSQL-databaser. MongoDB, DynamoDB, Firestore, Elasticsearch, CouchDB — alle bruker JSON (eller et binært supersett som BSON) som sitt native dokumentformat. Du skriver JSON inn, du får JSON tilbake.
  • Konfigurasjonsfiler. package.json, tsconfig.json, manifest.json — verktøyskonfigurasjon har standardisert seg på JSON fordi det støtter kommentarlignende via dedikerte felt, tillater nestede strukturer og er lett å programmatisk generere og validere.
  • Skjemavalidering. JSON Schema lar deg definere den eksakte formen til et dokument og validere data mot det — typekontroller, påkrevde felt, mønstermatch, matrisbegrensninger. CSV har ingen tilsvarende standard.

Filstørrelse: Den Virkelige Historien

Påstanden "CSV er mindre" er sann i ett spesifikt tilfelle: store flate tabeller med mange rader. Ta 100 000 analysehendelser, hver med åtte faste felt. I CSV vises feltnavn én gang i overskriften. I JSON vises de på hvert objekt. Den gjentagelsen summerer seg — JSON-matrisen kan være 30–50 % større enn den tilsvarende CSV-en.

Men snu scenariet til nestede data og matematikken endres. Den flate CSV-en av skokatalogen vår gjentar produktnavnet, prisen og attributtene på hver variantrad. JSON-versjonen lagrer hvert produkt én gang. For dypt nestede data med mange gjentatte overordnede felt kan JSON faktisk være mindre.

I praksis, hvis filstørrelse er et reelt problem, komprimerer begge formater ekstremt godt med gzip — de gjentatte nøkkelnavnene i JSON og gjentatte radverdiene i CSV komprimerer begge tungt. Å betjene gzipped JSON over HTTP er standard praksis, og størrelsesforskjellen blir vanligvis ubetydelig etter komprimering.

Verktøysammenligning

Verktøyhistorien for hvert format gjenspeiler hvor det brukes mest.

CSV-verktøy: Excel, Google Sheets og LibreOffice Calc åpner det nativt. pandas-biblioteket gjør CSV til standard for dataanalyse i Python. Alle relasjonsdatabaser har en CSV-import/eksport- kommando. Kommandolinjeverktøy som csvkit og xsv lar deg filtrere, joine, og aggregere CSV-filer uten å skrive kode. MIME-typen er text/csv, registrert med IANA.

JSON-verktøy: Alle programmeringsspråk har en innebygd eller standardbibliotek JSON-parser. JSON.parse() i JavaScript, json.loads() i Python, encoding/json i Go, serde_json i Rust. MDN JSON-referansen er en av de mest besøkte sidene på MDN. Kommandolinje: jq er uunnværlig for spørring og transformasjon av JSON. IDE-er prettyprintter og validerer det automatisk.

Hvis du arbeider med datapipeliner som spenner over begge verdener — laster JSON API-svar inn i et datalagerhus, eller eksporterer databaseposter for et regneark — vil du regelmessig konvertere mellom de to. CSV til JSON-konverteren og JSON til CSV-konverteren håndterer det raskt. For å rydde opp rå filer før behandling er CSV-formatering og JSON-formatering verdt å bokmerke.

Hybriden: JSON Lines (NDJSON)

Det er et tredje alternativ verdt å vite om: JSON Lines, også kalt NDJSON (Newline-Delimited JSON). Ideen er enkel — ett komplett JSON-objekt per linje, ingen omliggende matrise.

json
{"id":"SHOE-001","name":"Trail Runner Pro","price":129.99,"inStock":true,"variantCount":3}
{"id":"SHOE-002","name":"City Walker","price":89.99,"inStock":true,"variantCount":2}
{"id":"SHOE-003","name":"Summit Hiker","price":159.99,"inStock":false,"variantCount":5}

Dette formatet gir deg det beste fra begge verdener for visse brukstilfeller. Som CSV kan du strømme og behandle det linje for linje uten å laste hele filen inn i minnet — kritisk for store loggfiler eller datapipelineutdata. Som JSON kan hver linje ha et annet skjema og bevarer typer. Du kan bruke standard Unix-verktøy (grep, wc -l, head) for å arbeide med det, men også pipe hver linje gjennom jq for strukturert spørring.

NDJSON er mye brukt for logg-aggregering (det er standard utdataformat for mange strukturerte loggere), datapipelinestadier og ML-treningsdata-eksporter. Hvis du skriver et skript som behandler millioner av poster og hver post er et JSON-objekt, er NDJSON vanligvis det rette valget over en stor JSON-matrise — du unngår å laste hele greia inn i minnet og du kan gjenoppta fra et sjekkpunkt enkelt.

python
import json

# Process a large NDJSON file without loading it all into memory
with open('products.ndjson', 'r') as f:
    for line in f:
        product = json.loads(line.strip())
        if product['inStock'] and product['price'] < 100:
            print(f"{product['name']} — ${product['price']}")

Beslutningsguide: CSV vs JSON

Her er den praktiske versjonen. Når du velger mellom de to, still deg disse spørsmålene:

  • Er dataene dine genuint flate (ingen nesting, ingen matriser)? Hvis ja, er CSV enklere. Hvis nei, JSON.
  • Vil en ikke-utvikler konsumere denne filen? Analytikere i Excel? Forretningsbrukere i Google Sheets? Bruk CSV.
  • Betjener eller konsumerer du et HTTP API? Bruk JSON. Punktum.
  • Gjør du en bulk-database-import eller -eksport? Bruk CSV — alle databaser støtter det nativt.
  • Har dataene blandede typer (booleaner, tall, nulls)? Bruk JSON for å unngå type-slutning-feil på mottakersiden.
  • Vil filen bli behandlet rad for rad i en strømmende pipeline? Vurder NDJSON som et midtpunkt.
  • Lagrer du konfigurasjon? Bruk JSON (eller YAML hvis kommentarer er viktige for deg).
  • Trenger skjemaet å variere per post? JSON. CSV håndhever de samme kolonnene på alle rader.
Det ærlige standard: Hvis du bygger noe for andre utviklere eller maskiner å konsumere, bruk JSON. Hvis du gir data til en person som vil åpne det i et regneark, bruk CSV. Hvis du bygger en datapipeline som behandler millioner av strukturerte poster, vurder NDJSON.

Oppsummering

CSV og JSON konkurrerer egentlig ikke — de løser forskjellige problemer. CSV er det rette verktøyet når dataene dine er en tabell og du vil ha maksimal kompatibilitet med regneark- og database-verktøy. JSON er det rette verktøyet når dataene dine har struktur, typer eller nesting, og når du snakker med API-er eller applikasjoner.

Beslutningen er vanligvis ikke vanskelig når du ser på den faktiske formen til dataene. Flate rader med sensoravlesninger? CSV. Et API-svar med nestede brukerprofiler og innebygde ordrehistorikker? JSON. En strømmende logg med strukturerte hendelser? NDJSON. Match formatet til formen på dataene og verktøyene på begge sider, og du vil sjelden ta feil.