CSV to JSON JavaScript — Converter + Code Examples

·Front-end & Node.js Developer·ZkontrolovánoSophie Laurent·Publikováno

Používejte bezplatný CSV to JSON přímo v prohlížeči — bez instalace.

Vyzkoušet CSV to JSON online →

Většina CSV dat, se kterými se setkávám, přichází jako plochý řetězec z nahrání souboru, exportu z databáze nebo API, které stále používá formát ze 70. let. Převod CSV na JSON v JavaScriptu vyžaduje dvě věci, které vám jazyk dává zadarmo: rozdělování řetězce pro parsování řádků a JSON.stringify() pro serializaci výsledku. Pro základní použití nejsou potřeba žádné npm balíčky — tato příručka pokrývá celý postup od znovupoužitelné funkce csvToJson() přes PapaParse až po práci se soubory v Node.js. Pro rychlé převody bez psaní kódu online převodník CSV na JSON zvládne vše okamžitě. Všechny příklady cílí na Node.js 18+ a moderní prohlížeče.

  • Rozdělte CSV podle nového řádku, z řádku 0 extrahujte záhlaví, mapujte zbývající řádky na objekty, pak zavolejte JSON.stringify(array, null, 2) pro formátovaný výstup.
  • JSON.stringify() vrací řetězec; JSON.parse() ho převede zpět na živé JavaScript pole — vězte, co máte, než s tím začnete pracovat.
  • Instance Map se na JSON automaticky neserializují — nejprve zavolejte Object.fromEntries(map).
  • Pro CSV s uvozovanými poli, čárkami uvnitř hodnot nebo novými řádky v buňkách použijte PapaParse nebo csv-parse místo manuálního rozdělování.
  • csvtojson (npm) zpracovává typovou konverzi, streaming a okrajové případy RFC 4180 v jediném volání.

Co je převod CSV na JSON?

Převod CSV na JSON transformuje plochý text oddělený čárkami na strukturované pole objektů, kde každý řádek se stane JavaScript objektem s klíči z názvů sloupců. Formát CSV nemá datové typy — vše je řetězec. JSON přidává strukturu, vnoření a explicitní typy (čísla, booleany, null). Tento převod je prvním krokem téměř v každém datovém procesu, který začíná exportem z tabulkového procesoru, výpisem z legacy systému nebo souborem nahraným uživatelem. Základní data zůstávají stejná; formát se mění z pozicových sloupců na pojmenované vlastnosti.

Before · json
After · json
name,email,role,active
Jan Novák,jnovak@nexuslabs.io,Engineering Lead,true
Marie Svobodová,msvobodova@nexuslabs.io,Product Manager,true
[
  {
    "name": "Jan Novák",
    "email": "jnovak@nexuslabs.io",
    "role": "Engineering Lead",
    "active": "true"
  },
  {
    "name": "Marie Svobodová",
    "email": "msvobodova@nexuslabs.io",
    "role": "Product Manager",
    "active": "true"
  }
]

csvToJson() — Vytvoření znovupoužitelné konverzní funkce

Celý postup CSV na JSON v JavaScriptu se skládá ze tří kroků: rozdělte CSV řetězec podle nového řádku pro získání řádků, z prvního řádku pomocí split(',') extrahujte záhlaví, pak mapujte každý zbývající řádek na prostý JavaScript objekt, jehož klíče pocházejí ze záhlaví a hodnoty z odpovídajících pozic sloupců. Závěrečné volání JSON.stringify() převede toto pole objektů na JSON řetězec. Zde je minimální funkční verze:

JavaScript — minimální csvToJson
function csvToJson(csv) {
  const lines = csv.trim().split('\n')
  const headers = lines[0].split(',').map(h => h.trim())

  const rows = lines.slice(1)
    .filter(line => line.trim() !== '')
    .map(line => {
      const values = line.split(',')
      return Object.fromEntries(
        headers.map((header, i) => [header, values[i]?.trim()])
      )
    })

  return JSON.stringify(rows, null, 2)
}

const csv = `server,port,region,status
api-gateway,8080,us-east-1,healthy
auth-service,8443,eu-west-1,degraded
payments-api,9090,ap-south-1,healthy`

console.log(csvToJson(csv))
// [
//   { "server": "api-gateway", "port": "8080", "region": "us-east-1", "status": "healthy" },
//   { "server": "auth-service", "port": "8443", "region": "eu-west-1", "status": "degraded" },
//   { "server": "payments-api", "port": "9090", "region": "ap-south-1", "status": "healthy" }
// ]

Tato funkce zvládne základy: koncové nové řádky, prázdné řádky, bílé znaky kolem hodnot. Každé CSV pole prochází jako řetězec. Všimněte si, že port je "8080" (řetězec), nikoli 8080 (číslo). Pokud potřebujete správné typy ve výstupu JSON, musíte je převádět sami. Zde je rozšířená verze s detekcí typů:

JavaScript — csvToJson s typovou konverzí
function coerceValue(val) {
  if (val === undefined || val === '') return null
  if (val === 'true') return true
  if (val === 'false') return false
  if (val === 'null') return null
  const num = Number(val)
  if (!isNaN(num) && val.trim() !== '') return num
  return val
}

function csvToJson(csv, { coerce = false } = {}) {
  const lines = csv.trim().split('\n')
  const headers = lines[0].split(',').map(h => h.trim())

  const rows = lines.slice(1)
    .filter(line => line.trim() !== '')
    .map(line => {
      const values = line.split(',')
      return Object.fromEntries(
        headers.map((header, i) => [
          header,
          coerce ? coerceValue(values[i]?.trim()) : values[i]?.trim()
        ])
      )
    })

  return JSON.stringify(rows, null, 2)
}

const csv = `endpoint,port,max_connections,debug
/api/v2/orders,8443,500,true
/api/v2/health,8080,100,false`

console.log(csvToJson(csv, { coerce: true }))
// [
//   { "endpoint": "/api/v2/orders", "port": 8443, "max_connections": 500, "debug": true },
//   { "endpoint": "/api/v2/health", "port": 8080, "max_connections": 100, "debug": false }
// ]

Příznak coerce je volitelný, protože automatická detekce typů může způsobit problémy — pole jako PSČ ("07302") ztratí úvodní nulu při převodu na číslo. Ponechte konverzi vypnutou jako výchozí a zapínejte ji pouze tehdy, když máte schéma pod kontrolou. Stručná poznámka: JSON.stringify() přijímá třetí argument space pro odsazení. Předejte 2 pro dvě mezery, 4 pro čtyři, nebo "\t" pro tabulátory. Zcela vynechte pro kompaktní jednořádkový výstup — užitečné při odesílání JSON řetězce jako těla API požadavku, kde bílé znaky jen plýtvají šířkou pásma.

Poznámka:Surový CSV řetězec není JSON. Přímé volání JSON.parse() na CSV textu vyvolá SyntaxError. Nejprve musíte CSV převést na JavaScript objekty pomocí vaší funkce csvToJson(), která interně volá JSON.stringify() pro vytvoření skutečného JSON řetězce.

Zpracování Map, dat a vlastních objektů z CSV dat

Ne každý převod CSV skončí plochým polem prostých objektů. Někdy potřebujete sestavit Map z párů záhlaví-hodnota, zparsovat datové řetězce na objekty Date nebo před serializací připojit vypočtené vlastnosti. JavaScript má zvláštnost, která lidi překvapuje: instance Map se pomocí JSON.stringify() neserializují. Získáte prázdný objekt. Řešením je Object.fromEntries() pro převod Map zpět na prostý objekt před serializací.

Důvod, proč se Map serializuje na {}, je ten, že JSON.stringify() iteruje přes vlastní vyčíslitelné vlastnosti objektu. Map ukládá své záznamy do interního slotu, nikoli jako vyčíslitelné vlastnosti samotného objektu, takže serializátor vidí objekt bez klíčů. Prototypu Map také chybí metoda toJSON(), což je háček, který JSON.stringify() volá jako první na každé hodnotě před rozhodnutím o způsobu serializace. Pokud hodnota má toJSON(), co metoda vrátí, to se serializuje — nikoli objekt samotný. Proto se Date objekty serializují správně: Date.prototype.toJSON vrátí řetězec ISO 8601, takže JSON.stringify(new Date()) vytvoří časové razítko v uvozovkách místo prázdného objektu. Pochopení tohoto háčku vám umožňuje definovat stejné chování na vlastních třídách — jak je ukázáno v příkladu EmployeeRecord níže — pro přesnou kontrolu toho, která pole odvozená z CSV se objeví ve výsledném JSON výstupu.

Převod Map na JSON

JavaScript — Map na JSON přes Object.fromEntries()
// Sestavení Map z párů CSV záhlaví→hodnota
const headers = ['server', 'port', 'region']
const values = ['payments-api', '9090', 'ap-south-1']
const rowMap = new Map(headers.map((h, i) => [h, values[i]]))

// Map se NESERIALIZUJE přímo
console.log(JSON.stringify(rowMap))
// "{}"  — prázdný objekt, data ztracena!

// Nejprve převeďte na prostý objekt
const rowObj = Object.fromEntries(rowMap)
console.log(JSON.stringify(rowObj, null, 2))
// {
//   "server": "payments-api",
//   "port": "9090",
//   "region": "ap-south-1"
// }

Datové řetězce a toJSON()

CSV datová pole přicházejí jako řetězce. Pokud je při zpracování zparsujete na objekty Date, ty se serializují správně, protože Date má vestavěnou metodu toJSON() vracející řetězec ISO 8601. Na vlastních třídách můžete také definovat vlastní toJSON() pro řízení toho, které CSV sloupce se objeví v serializovaném výstupu — například vynechání interních sledovacích polí jako _rowIndex.

JavaScript — toJSON() pro vlastní serializaci
class EmployeeRecord {
  constructor(csvRow) {
    this._rowIndex = csvRow._rowIndex  // interní, ne pro JSON
    this.employeeId = csvRow.employee_id
    this.name = csvRow.name
    this.hiredAt = new Date(csvRow.hired_date)
    this.salary = Number(csvRow.salary)
  }

  toJSON() {
    // Exportovat pouze pole, která chceme ve výstupu JSON
    return {
      employee_id: this.employeeId,
      name: this.name,
      hired_at: this.hiredAt,  // Date.toJSON() → ISO řetězec automaticky
      salary: this.salary,
    }
  }
}

const csvRow = {
  _rowIndex: 42,
  employee_id: 'EMP-2847',
  name: 'Jan Novák',
  hired_date: '2024-03-15',
  salary: '128000',
}

const record = new EmployeeRecord(csvRow)
console.log(JSON.stringify(record, null, 2))
// {
//   "employee_id": "EMP-2847",
//   "name": "Jan Novák",
//   "hired_at": "2024-03-15T00:00:00.000Z",
//   "salary": 128000
// }
// Poznámka: _rowIndex je vynechán, salary je číslo, datum je ve formátu ISO

Reviver pro deserializaci dat

Po zapsání JSON odvozeného z CSV do souboru nebo odeslání přes síť vrátí JSON.parse() prostý objekt — objekty Date se stanou znovu řetězci. Použijte funkci reviver pro převod řetězců ISO 8601 zpět na objekty Date při parsování:

JavaScript — reviver pro rekonstrukci objektů Date
const jsonString = '{"employee_id":"EMP-2847","name":"Jan Novák","hired_at":"2024-03-15T00:00:00.000Z","salary":128000}'

const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/

const parsed = JSON.parse(jsonString, (key, value) => {
  if (typeof value === 'string' && isoDatePattern.test(value)) {
    return new Date(value)
  }
  return value
})

console.log(parsed.hired_at instanceof Date)  // true
console.log(parsed.hired_at.getFullYear())    // 2024
Varování:JSON.stringify() vrátí undefined (nikoli řetězec) pro hodnoty obsahující funkce, Symboly nebo vlastnosti s hodnotou undefined. Pokud vaše objekty odvozené z CSV náhodně získají hodnotu undefined z chybějícího sloupce, tato vlastnost tiše zmizí z výstupu JSON. Vždy používejte místo toho výchozí hodnotu null.

Referenční přehled parametrů JSON.stringify()

Signatura funkce je JSON.stringify(value, replacer?, space?). Argumenty replacer a space jsou oba volitelné — předejte null pro replacer, pokud potřebujete pouze odsazení.

Parametr
Typ
Výchozí
Popis
value
any
(povinný)
JavaScript hodnota k serializaci — objekt, pole, řetězec, číslo, boolean nebo null
replacer
Function | Array | null
undefined
Filtrování nebo transformace hodnot při serializaci. Pole povoluje názvy vlastností; funkce přijímá dvojice (klíč, hodnota)
space
number | string
undefined
Odsazení: číslo 0–10 pro mezery, řetězec (např. "\t") pro vlastní odsazení. Vynechte pro kompaktní jednořádkový výstup

Parametry JSON.parse():

Parametr
Typ
Výchozí
Popis
text
string
(povinný)
JSON řetězec ke zpracování — musí být platný JSON, jinak je vyvolána chyba SyntaxError
reviver
Function | undefined
undefined
Volána pro každý pár klíč-hodnota. Vrácená hodnota nahrazuje původní; vrácení undefined vlastnost odstraní

JSON.parse() — Zpracování výstupu JSON

Jakmile máte JSON řetězec z funkce csvToJson(), dalším krokem je obvykle jeho zparsování zpět na živé JavaScript pole pro filtrování, mapování nebo předání do API. Rozdíl mezi JSON řetězcem (typeof === "string") a JavaScript objektem je důležitý. Na řetězci nemůžete volat .filter() ani přistupovat na [0].name — nejprve potřebujete JSON.parse(). Tento cyklus (stringify a pak parse) funguje také jako technika validace: pokud váš převod CSV vytvoří něco, co není platný JSON, parse to vyvolá výjimku. Volitelný argument reviver vám umožňuje transformovat každý pár klíč-hodnota během parsování — užitečné pro obnovu objektů Date z ISO řetězců nebo přejmenování klíčů bez samostatného průchodu.

JavaScript — parsování výstupu JSON a dotazování řádků
const csv = `endpoint,method,avg_latency_ms,error_rate
/api/v2/orders,POST,342,0.02
/api/v2/health,GET,12,0.00
/api/v2/payments,POST,890,0.15
/api/v2/users,GET,45,0.01`

// Krok 1: převod CSV na JSON řetězec
const jsonString = csvToJson(csv, { coerce: true })

// Krok 2: zparsování zpět na JavaScript pole
const endpoints = JSON.parse(jsonString)

// Ověření, že je to pole
console.log(Array.isArray(endpoints))  // true

// Filtrování pomalých endpointů
const slow = endpoints.filter(ep => ep.avg_latency_ms > 200)
console.log(slow.map(ep => ep.endpoint))
// ["/api/v2/orders", "/api/v2/payments"]

// Destrukturování prvního řádku
const [first, ...rest] = endpoints
console.log(first.endpoint)  // "/api/v2/orders"
console.log(rest.length)     // 3

Bezpečný obal pro JSON.parse() je užitečný při validaci výstupu převodu před dalším zpracováním. Pokud převod CSV z jakéhokoli důvodu vytvoří neplatný JSON (zkrácený vstup, chyby kódování), zachytí to bez pádu:

JavaScript — bezpečný obal pro parse
function safeParse(jsonString) {
  try {
    return { data: JSON.parse(jsonString), error: null }
  } catch (err) {
    return { data: null, error: err.message }
  }
}

// Platný výstup
const result = safeParse(csvToJson(csv))
if (result.error) {
  console.error('Převod CSV vytvořil neplatný JSON:', result.error)
} else {
  console.log(`Zparsováno ${result.data.length} řádků`)
}

// Náhodné předání surového CSV do JSON.parse — toto selže
const bad = safeParse('name,email\nJan,jnovak@nexuslabs.io')
console.log(bad.error)  // "Unexpected token 'a', "name,email"... is not valid JSON"

Reviver pro přejmenování klíčů a validaci

Funkce reviver dostane každý pár klíč-hodnota během parsování, od nejvnitřnějších vlastností směrem ven. Vrácení undefined pro klíč ho z výsledku zcela odstraní; vrácení jiné hodnoty ho nahradí. Reviver je užitečný pro přejmenování záhlaví (camelCase na snake_case), odstraňování interních polí nebo kontrolu existence povinných sloupců. Je volán s kořenovou hodnotou jako poslední (klíč prázdný řetězec), kde vyvoláte výjimku, pokud výsledek není pole.

JavaScript — reviver pro přejmenování klíčů a validaci struktury
const jsonString = csvToJson(`employeeId,firstName,hiredDate
EMP-2847,Jan,2024-03-15
EMP-3012,Marie,2023-11-01`, { coerce: false })

const camelToSnake = str => str.replace(/[A-Z]/g, c => '_' + c.toLowerCase())

const employees = JSON.parse(jsonString, function(key, value) {
  // Kořenová hodnota — validace struktury
  if (key === '') {
    if (!Array.isArray(value)) throw new Error('Očekáváno JSON pole z CSV')
    return value
  }
  // Přejmenování klíčů camelCase záhlaví na snake_case
  if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
    return Object.fromEntries(
      Object.entries(value).map(([k, v]) => [camelToSnake(k), v])
    )
  }
  return value
})

console.log(employees[0])
// { employee_id: 'EMP-2847', first_name: 'Jan', hired_date: '2024-03-15' }

Převod CSV ze souboru a API odpovědi

Dvě místa, odkud CSV data skutečně pocházejí v produkci: soubory na disku a HTTP odpovědi. Oba scénáře vyžadují ošetření chyb, protože vstup je externí a nekontrolovaný.

Načtení CSV souboru, převod, zápis JSON

Node.js 18+ — převod souboru
import { readFileSync, writeFileSync } from 'node:fs'

function csvToJsonFromFile(inputPath, outputPath) {
  let csvText
  try {
    csvText = readFileSync(inputPath, 'utf8')
  } catch (err) {
    throw new Error(`Nepodařilo se přečíst ${inputPath}: ${err.message}`)
  }

  const lines = csvText.trim().split('\n')
  if (lines.length < 2) {
    throw new Error(`${inputPath} neobsahuje datové řádky (pouze ${lines.length} řádek)`)
  }

  const headers = lines[0].split(',').map(h => h.trim())
  const rows = lines.slice(1)
    .filter(line => line.trim() !== '')
    .map(line => {
      const values = line.split(',')
      return Object.fromEntries(headers.map((h, i) => [h, values[i]?.trim()]))
    })

  const jsonOutput = JSON.stringify(rows, null, 2)
  writeFileSync(outputPath, jsonOutput, 'utf8')
  console.log(`Převedeno ${rows.length} řádků → ${outputPath}`)
  return rows
}

// Použití
const data = csvToJsonFromFile('inventar.csv', 'inventar.json')
console.log(data[0])
// { sku: "WDG-2847", warehouse: "us-east-1", quantity: "150", ... }

Načtení CSV z API endpointu

Node.js 18+ — převod API odpovědi
async function fetchCsvAsJson(url) {
  const response = await fetch(url)
  if (!response.ok) {
    throw new Error(`HTTP ${response.status}: ${response.statusText}`)
  }

  const contentType = response.headers.get('content-type') || ''
  if (!contentType.includes('text/csv') && !contentType.includes('text/plain')) {
    console.warn(`Neočekávaný content-type: ${contentType}`)
  }

  const csvText = await response.text()
  const lines = csvText.trim().split('\n')
  const headers = lines[0].split(',').map(h => h.trim())
  const rows = lines.slice(1)
    .filter(line => line.trim() !== '')
    .map(line => {
      const values = line.split(',')
      return Object.fromEntries(headers.map((h, i) => [h, values[i]?.trim()]))
    })

  return rows
}

// Příklad: načtení CSV s kurzy měn od poskytovatele dat
try {
  const rates = await fetchCsvAsJson('https://data.ecb.internal/rates/daily.csv')
  console.log(JSON.stringify(rates.slice(0, 3), null, 2))
  // Odeslání jako JSON do navazující služby
  await fetch('https://api.internal/v2/rates', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ data: rates }),
  })
} catch (err) {
  console.error('Synchronizace kurzů selhala:', err.message)
}
Poznámka:Argument replacer v JSON.stringify() vám umožňuje přidat do výstupu pouze konkrétní sloupce z CSV. Předejte pole názvů záhlaví pro zahrnutí pouze těchto polí: JSON.stringify(rows, ['name', 'email', 'department']). Vlastnosti, které nejsou v poli, jsou tiše vyloučeny z výstupu.

Převod CSV na JSON z příkazové řádky

Node.js může spouštět inline skripty a existují specializované CLI nástroje pro převod CSV na JSON bez psaní skriptu.

bash — Node.js one-liner
# Pipe CSV do inline Node.js skriptu
cat servers.csv | node -e "
  const lines = require('fs').readFileSync('/dev/stdin','utf8').trim().split('\n');
  const h = lines[0].split(',');
  const rows = lines.slice(1).map(l => Object.fromEntries(h.map((k,i) => [k.trim(), l.split(',')[i]?.trim()])));
  console.log(JSON.stringify(rows, null, 2));
"
bash — Miller (mlr) pro převod CSV na JSON
# Miller je švýcarský nůž pro strukturovaná data
# Instalace: brew install miller (macOS) nebo apt install miller (Debian/Ubuntu)
mlr --icsv --ojson cat inventory.csv

# Filtrování řádků při převodu
mlr --icsv --ojson filter '$quantity > 100' inventory.csv

# Výběr konkrétních sloupců
mlr --icsv --ojson cut -f sku,warehouse,quantity inventory.csv
bash — csvtojson CLI
# Globální instalace
npm install -g csvtojson

# Převod souboru
csvtojson servers.csv > servers.json

# Pipe ze stdin
cat exports/q1-metrics.csv | csvtojson > q1-metrics.json

Pro velké soubory je Miller obvykle lepší volbou než csvtojson. Miller je implementován v C a zpracovává CSV jako stream bez načítání celého souboru do paměti, takže zvládá exporty o velikosti několika gigabajtů s konstantním využitím paměti. Podporuje také operace na úrovni polí — přejmenování sloupců, přetypování hodnot, filtrování řádků — ještě než se data stanou JSON, čímž se vyhnete dvoustupňovému procesu parsování a transformace. csvtojson naproti tomu běží v Node.js a je pohodlnější, když zbytek vaší nástrojové sady je JavaScript: jeho výstup lze přesměrovat přímo do Node.js streamů, importovat jako knihovnu nebo použít jeho colParser API pro typovou konverzi po sloupcích v kódu. Upřednostněte Miller pro surovou propustnost a shell pipeline; upřednostněte csvtojson, když potřebujete těsnou integraci s Node.js aplikací.

Poznámka:jq nativně neparsuje CSV. Pokud potřebujete jq v pipeline, nejprve převeďte na JSON pomocí csvtojson nebo mlr, pak předejte výstup JSON do jq pro filtrování a transformaci.

Výkonná alternativa — PapaParse

Manuální přístup s split(',') selhává na reálných CSV souborech. Uvozovaná pole obsahující čárky, vložené nové řádky, escapované dvojité uvozovky — to vše rozbíjí jednoduchý splitter. PapaParse je knihovna, po které sáhnu, když CSV pochází z neznámého zdroje. Zvládá všechny okrajové případy RFC 4180, automaticky detekuje oddělovače a funguje jak v Node.js, tak v prohlížečích.

bash — instalace PapaParse
npm install papaparse
JavaScript — PapaParse s typovou konverzí
import Papa from 'papaparse'

const csv = `product,description,price,in_stock
"Widget, Large","Prémiový widget s ""extra"" funkcemi",29.99,true
Bolt Assembly,Standardní sada šroubů M8,4.50,true
"Gasket Set","Obsahuje těsnění, seal a O-kroužek",12.75,false`

const { data, errors, meta } = Papa.parse(csv, {
  header: true,
  dynamicTyping: true,     // automatická konverze čísel a booleanů
  skipEmptyLines: true,
  transformHeader: h => h.trim().toLowerCase().replace(/\s+/g, '_'),
})

if (errors.length > 0) {
  console.error('Chyby parsování:', errors)
}

console.log(JSON.stringify(data, null, 2))
// [
//   {
//     "product": "Widget, Large",
//     "description": "Prémiový widget s \"extra\" funkcemi",
//     "price": 29.99,
//     "in_stock": true
//   },
//   ...
// ]
console.log(`Zparsováno ${data.length} řádků, oddělovač: "${meta.delimiter}"`)

Volba dynamicTyping v PapaParse provádí typovou konverzi automaticky — čísla se stanou čísly, "true"/"false" se stanou booleany. Zpětné volání transformHeader normalizuje názvy sloupců na snake_case, čímž vás ušetří od práce s nekonzistentními záhlavími z různých CSV exportů. Pro rychlé převody bez psaní kódu parsování zvládne převodník CSV na JSON vše v prohlížeči.

Výstup v terminálu se zvýrazněním syntaxe

Výpis velkého JSON pole do terminálu vám rychle unaví oči. Přidání zvýraznění syntaxe výstupu ho zpřehlední při ladění a vývoji. Balíček cli-highlight obarvuje JSON výstup v terminálech Node.js.

bash — instalace cli-highlight
npm install cli-highlight
JavaScript — barevný JSON výstup v terminálu
import { highlight } from 'cli-highlight'

// Po převodu CSV na JSON pole
const jsonOutput = JSON.stringify(rows, null, 2)

// Výpis se zvýrazněním syntaxe
console.log(highlight(jsonOutput, { language: 'json' }))
// Klíče, řetězce, čísla a booleany mají každý jinou barvu

Barevný výstup se vyplatí při interaktivní inspekci výsledku velkého převodu. JSON klíče, řetězcové hodnoty, čísla a booleany mají každý jinou ANSI barvu, díky čemuž je snadné odhalit pole se špatným typem — například číslo portu, které by mělo být 8080, ale je zvýrazněno jako řetězec, protože konverze byla vypnuta. Zvlášť užitečné je to při ladění CSV souborů exportovaných z tabulkových nástrojů, kde jsou typy sloupců v řádcích nekonzistentní. Bez barvy znamená prohledání 50 řádků JSON pro jediné chybně zadané pole čtení každé hodnoty zvlášť. S barvou okamžitě vynikne číslo zbarvené jako řetězec.

Varování:Zvýraznění syntaxe přidává do výstupu ANSI escape kódy. Nepoužívejte ho při zápisu JSON do souboru, předávání dalšímu programu nebo odesílání jako těla API odpovědi — escape kódy by JSON poškodily. Zvýraznění používejte pouze pro zobrazení v terminálu.

Práce s velkými CSV soubory

Načtení 500 MB CSV souboru do řetězce pomocí readFileSync() spotřebuje paměť a může způsobit pád procesu. Pro velké soubory streamujte CSV řádek po řádku a emitujte JSON objekty, jak přicházejí. Balíček csv-parse (součást ekosystému csv na npm) poskytuje streamovací parser, který funguje s Node.js streamy.

Streamování CSV do NDJSON pomocí csv-parse

NDJSON (Newline-Delimited JSON) je formát, kde každý řádek výstupního souboru je samostatný JSON objekt. Na rozdíl od jednoho velkého JSON pole — které vyžaduje celý soubor v paměti, než ho lze začít číst — lze soubory NDJSON zpracovávat řádek po řádku. To dělá NDJSON ideálním pro velké datové sady, které budou konzumovány procesory logů, stream pipeline nebo databázemi s API pro hromadný import. Balíček csv-parse emituje jeden JavaScript objekt na CSV řádek v object mode, takže ho lze přímo propojit do transform streamu, který připojí \n za každý JSON.stringify(row).

Node.js 18+ — streamování CSV do NDJSON
import { createReadStream, createWriteStream } from 'node:fs'
import { parse } from 'csv-parse'
import { Transform } from 'node:stream'
import { pipeline } from 'node:stream/promises'

// Transformace každého objektu CSV řádku na JSON řádek
const toNdjson = new Transform({
  objectMode: true,
  transform(record, encoding, callback) {
    callback(null, JSON.stringify(record) + '\n')
  },
})

await pipeline(
  createReadStream('telemetry-2026-03.csv'),
  parse({
    columns: true,       // použít první řádek jako záhlaví
    skip_empty_lines: true,
    trim: true,
    cast: true,          // automatická konverze čísel a booleanů
  }),
  toNdjson,
  createWriteStream('telemetry-2026-03.ndjson')
)

console.log('Streamovací převod dokončen')
// Každý řádek ve výstupním souboru je jeden JSON objekt:
// {"timestamp":"2026-03-15T08:22:00Z","service":"gateway","latency_ms":42,"status":200}
// {"timestamp":"2026-03-15T08:22:01Z","service":"auth","latency_ms":156,"status":401}
// ...

Streamování PapaParse pro prohlížeč a Node.js

Streamovací mód PapaParse používá zpětné volání step, které se spustí jednou za řádek místo shromažďování všech řádků v paměti. Předáte mu Node.js ReadStream (v Node.js) nebo objekt File (v prohlížeči) a PapaParse interně spravuje rozdělování na části. Žádná stream pipeline k propojení — jen zpětné volání. Použijte ho, když potřebujete soulad s RFC 4180 bez zahrnutí csv-parse.

Node.js — PapaParse streamování velkého souboru
import Papa from 'papaparse'
import { createReadStream } from 'node:fs'

let rowCount = 0
const errors = []

const fileStream = createReadStream('warehouse-inventory.csv')

Papa.parse(fileStream, {
  header: true,
  dynamicTyping: true,
  step(result) {
    // Zpracování jednoho řádku najednou — konstantní paměť
    rowCount++
    if (result.data.quantity === 0) {
      errors.push(`Řádek ${rowCount}: ${result.data.sku} není skladem`)
    }
  },
  complete() {
    console.log(`Zpracováno ${rowCount} řádků`)
    if (errors.length > 0) {
      console.log(`Nalezeny problémy: ${errors.length}`)
      errors.forEach(e => console.log(`  ${e}`))
    }
  },
  error(err) {
    console.error('Parsování selhalo:', err.message)
  },
})
Poznámka:Přejděte na streaming, pokud váš CSV soubor přesahuje 50 MB nebo když zpracováváte neomezený vstup (WebSocket feed, server-sent events, piped stdin). Formát NDJSON (jeden JSON objekt na řádek) je pro velké datové sady často lepším výstupním formátem než obrovské JSON pole — lze ho zpracovávat řádek po řádku bez načítání celého souboru do paměti.

Časté chyby

Přímé volání JSON.parse() na CSV řetězci

Problém: CSV není JSON. Předání surového CSV řetězce do JSON.parse() vyvolá SyntaxError, protože čárky a nové řádky nejsou platnou syntaxí JSON.

Řešení: Nejprve zparsujte CSV na JavaScript objekty pomocí split() nebo knihovny, pak použijte JSON.stringify() pro vytvoření JSON. JSON.parse() volejte pouze na řetězcích, které jsou již platným JSON.

Before · JavaScript
After · JavaScript
const csv = 'name,email\nJan Novák,jnovak@nexuslabs.io'
const data = JSON.parse(csv)
// SyntaxError: Unexpected token 'a'
const csv = 'name,email\nJan Novák,jnovak@nexuslabs.io'
const lines = csv.trim().split('\n')
const headers = lines[0].split(',')
const rows = lines.slice(1).map(line =>
  Object.fromEntries(headers.map((h, i) => [h, line.split(',')[i]]))
)
const json = JSON.stringify(rows, null, 2)  // platný JSON řetězec
Použití toString() místo JSON.stringify()

Problém: Volání toString() na JavaScript objektu vrátí bezcenný řetězec '[object Object]' místo skutečných dat. Tím tiše zničíte výstup převodu CSV na JSON.

Řešení: Vždy používejte JSON.stringify() pro převod JavaScript objektů na JSON řetězce. toString() existuje pro koerci primitivů na řetězce, nikoli pro serializaci.

Before · JavaScript
After · JavaScript
const row = { server: 'api-gateway', port: 8080 }
const output = row.toString()
// "[object Object]"  — data jsou pryč
const row = { server: 'api-gateway', port: 8080 }
const output = JSON.stringify(row, null, 2)
// '{"server":"api-gateway","port":8080}'
Rozdělování podle čárky bez zpracování uvozovaných polí

Problém: Jednoduchý split(",") selže, když CSV hodnoty obsahují čárky uvnitř uvozovaných polí: "Widget, Large" se stane dvěma oddělenými hodnotami místo jedné.

Řešení: Pro jakékoli CSV data, která plně nekontrolujete, použijte PapaParse nebo csv-parse. Pokud musíte parsovat ručně, implementujte stavový automat, který sleduje, zda je aktuální pozice uvnitř uvozovaného pole.

Before · JavaScript
After · JavaScript
const line = '"Widget, Large","Premium quality",29.99'
const values = line.split(',')
// ["\"Widget", " Large\"", "\"Premium quality\"", "29.99"]
// 4 hodnoty místo 3 — první pole rozděleno nesprávně
import Papa from 'papaparse'
const { data } = Papa.parse('"Widget, Large","Premium quality",29.99')
// data[0] = ["Widget, Large", "Premium quality", "29.99"]
// 3 hodnoty, správně zparsovány
Zapomínání, že všechny CSV hodnoty jsou řetězce

Problém: Bez typové konverze zůstane port: "8080" jako řetězec v JSON místo čísla. Navazující systémy očekávající číselné typy data odmítnou nebo špatně zpracují.

Řešení: Během kroku mapování aplikujte explicitní typovou konverzi, nebo použijte PapaParse s dynamicTyping: true. Vždy buďte záměrní ohledně toho, která pole mají být číselná.

Before · JavaScript
After · JavaScript
const row = { port: '8443', debug: 'true', workers: '4' }
JSON.stringify(row)
// {"port":"8443","debug":"true","workers":"4"}  — vše řetězce
const row = {
  port: Number('8443'),           // 8443
  debug: 'true' === 'true',      // true
  workers: Number('4'),           // 4
}
JSON.stringify(row)
// {"port":8443,"debug":true,"workers":4}  — správné typy

Manuální parsování vs. knihovny — rychlé srovnání

Metoda
Formátovaný výstup
Platný JSON
Vlastní typy
Streaming
Vyžaduje instalaci
JSON.stringify()
✓ (s parametrem space)
✓ přes toJSON()/replacer
Ne (vestavěné)
JSON.parse()
N/A (parsování)
✓ (validuje)
✓ přes reviver
Ne (vestavěné)
csv-parse (Node.js)
✗ (vrací objekty)
✗ (není JSON)
npm install
PapaParse
✗ (vrací objekty)
✗ (není JSON)
npm install
csvtojson
✓ přes colParser
npm install
jq (CLI)
N/A
Systémová instalace
Miller (CLI)
N/A
Systémová instalace

Pro rychlé skripty, kde máte CSV formát pod kontrolou a víte, že neobsahuje uvozovaná pole, funguje vestavěný přístup s split() + JSON.stringify() a nevyžaduje žádné závislosti. Pro produkční systémy zpracovávající CSV soubory nahrané uživateli použijte PapaParse v prohlížeči nebo csv-parse v Node.js — oba zpracovávají RFC 4180 správně a podporují streaming. Balíček csvtojson je jediný, který výstup JSON generuje přímo a zvládá parsování i serializaci v jediném volání. Když potřebujete nejrychlejší cestu od vložení k výsledku, převodník CSV na JSON vše zvládne v prohlížeči bez jakéhokoli nastavení.

Často kladené otázky

Jak převést CSV na JSON v JavaScriptu bez knihovny?

Rozdělte CSV řetězec podle nového řádku na řádky, z prvního řádku pomocí split(",") extrahujte záhlaví, pak mapujte zbývající řádky na objekty s klíči z těchto záhlaví. Na závěr zavolejte JSON.stringify(array, null, 2) pro formátovaný JSON řetězec. Tento přístup funguje dobře pro jednoduché CSV soubory, kde máte pod kontrolou formát a víte, že neobsahují uvozované pole ani vložené čárky. U dat z exportů tabulkových procesorů nebo systémů třetích stran budou uvozovaná pole a víceřádkové hodnoty jednoduchý splitter rozbíjet — v takových případech přejděte na PapaParse nebo csv-parse. Pro velmi malé soubory zpracovávané v prohlížeči je tento přístup bez závislostí ideální.

JavaScript
const csv = `name,email,department
Jan Novák,jnovak@nexuslabs.io,Engineering
Marie Svobodová,msvobodova@nexuslabs.io,Product`

const lines = csv.trim().split('\n')
const headers = lines[0].split(',')
const rows = lines.slice(1).map(line => {
  const values = line.split(',')
  return Object.fromEntries(headers.map((h, i) => [h.trim(), values[i]?.trim()]))
})

console.log(JSON.stringify(rows, null, 2))
// [
//   { "name": "Jan Novák", "email": "jnovak@nexuslabs.io", "department": "Engineering" },
//   { "name": "Marie Svobodová", "email": "msvobodova@nexuslabs.io", "department": "Product" }
// ]

Jaký je rozdíl mezi JSON.stringify() a toString() pro objekty?

toString() na prostém objektu vrátí bezcenný řetězec "[object Object]" — nevypovídá nic o skutečných datech. JSON.stringify() vytvoří platný JSON řetězec se všemi klíči a hodnotami správně serializovanými, včetně vnořených objektů a polí. Vždy používejte JSON.stringify(), když potřebujete převést JavaScript objekt (například řádek odvozený z CSV) na JSON řetězec. Pro obrácení operace — rekonstrukci živých JavaScript objektů z JSON řetězce — použijte JSON.parse(), což je přesná inverze JSON.stringify(). Tyto dvě funkce tvoří kompletní cyklus: stringify pro uložení nebo přenos dat, parse pro jejich konzumaci.

JavaScript
const row = { name: 'Jan Novák', role: 'Engineer' }

console.log(row.toString())       // "[object Object]"
console.log(JSON.stringify(row))   // '{"name":"Jan Novák","role":"Engineer"}'

Jak zpracovat CSV pole obsahující čárky nebo uvozovky?

RFC 4180 stanoví, že pole obsahující čárky, nové řádky nebo dvojité uvozovky musí být obalena dvojitými uvozovkami, přičemž vložené uvozovky jsou escapovány jejich zdvojením ("" uvnitř uvozovaného pole představuje jednu doslovnou uvozovku). Manuální split(",") na takových souborech selže — hranice pole již není prostá čárka. Pro produkční data použijte PapaParse nebo csv-parse, nebo napište stavový automat, který sleduje, zda se nacházíte uvnitř uvozovaného pole. Napsání správného stavového automatu od nuly je překvapivě složité: musíte zpracovat uvozovky na začátku pole, escapované uvozovky uprostřed pole, nové řádky uvnitř uvozovaných polí a různé konvence konců řádků (CRLF vs LF). Pro jakákoli data nad rámec hračkového CSV používejte prověřenou knihovnu.

JavaScript
// PapaParse zpracovává RFC 4180 správně
import Papa from 'papaparse'

const csv = `product,description,price
"Widget, Large","A big ""widget""",29.99
Bolt,Standard bolt,1.50`

const { data } = Papa.parse(csv, { header: true })
console.log(JSON.stringify(data, null, 2))
// pole description správně obsahuje: A big "widget"

Mohu převést CSV na JSON přímo v prohlížeči?

Ano. Jak JSON.stringify(), tak JSON.parse() jsou vestavěné v každém prohlížeči. Pro krok parsování CSV můžete u jednoduchých souborů rozdělovat podle nového řádku a čárky, nebo přidat PapaParse přes CDN (nemá závislosti na Node.js). Celý převod probíhá na straně klienta bez komunikace se serverem, což je užitečné pro ochranu soukromí dat — surová CSV data nikdy neopustí uživatelovo zařízení. Když uživatel nahraje CSV soubor přes prvek <input type="file">, metoda file.text() z File API vrátí Promise, který se vyřeší na obsah souboru jako řetězec, který pak můžete předat vaší konverzní funkci. To umožňuje plně prohlížečový převod CSV na JSON pro dashboardy, vývojářské nástroje a každou aplikaci, která potřebuje zpracovávat nahraná data bez backendu.

JavaScript
// Prohlížeč: uživatel nahraje CSV soubor
const fileInput = document.querySelector('input[type="file"]')
fileInput.addEventListener('change', async (event) => {
  const file = event.target.files[0]
  const text = await file.text()
  const lines = text.trim().split('\n')
  const headers = lines[0].split(',')
  const rows = lines.slice(1).map(line =>
    Object.fromEntries(headers.map((h, i) => [h.trim(), line.split(',')[i]?.trim()]))
  )
  console.log(JSON.stringify(rows, null, 2))
})

Jak zpracovat číselné a booleovské hodnoty z CSV místo ponechání všeho jako řetězce?

CSV nemá typový systém — každé pole je řetězec. Hodnoty musíte převádět během kroku mapování. Číselné vzory detekujte pomocí Number() nebo parseFloat(), "true"/"false" převeďte na booleany a prázdné řetězce zpracujte jako null. Buďte opatrní s poli, která vypadají jako čísla, ale musí zůstat řetězci: PSČ jako "07302" ztratí úvodní nulu při převodu pomocí Number(), a telefonní čísla nebo kódy produktů s číselnými znaky jsou podobně křehké. Knihovna csvtojson provádí automatickou typovou konverzi přes svoji volbu colParser, která vám umožňuje zadat funkce pro konverzi po sloupcích a přepsat automatickou detekci pro problémové sloupce. Volba dynamicTyping v PapaParse aplikuje stejnou konverzi globálně přes všechny sloupce.

JavaScript
function coerceValue(val) {
  if (val === '') return null
  if (val === 'true') return true
  if (val === 'false') return false
  const num = Number(val)
  if (!isNaN(num) && val.trim() !== '') return num
  return val
}

// Použití při mapování CSV na objekty
const row = { port: coerceValue('8443'), debug: coerceValue('true'), host: coerceValue('api.internal') }
// { port: 8443, debug: true, host: "api.internal" }

Jak zapsat výstup CSV na JSON do souboru v Node.js?

Použijte fs.writeFileSync() s výstupem JSON.stringify(). Třetí argument JSON.stringify() řídí odsazení — předejte 2 pro odsazení dvěma mezerami nebo "\t" pro tabulátory. Pro načtení souboru zpět použijte JSON.parse(fs.readFileSync(path, "utf8")), který rekonstruuje živé JavaScript pole objektů. Pokud zapisujete soubor v asynchronním kontextu (uvnitř async funkce nebo na nejvyšší úrovni ES modulu), upřednostněte fs.promises.writeFile() aby nedošlo k blokování smyčky událostí během zápisu souboru. Pro velké JSON výstupy přesahující několik megabajtů zvažte propojení JSON streamu do WriteStream místo sestavování celého řetězce v paměti před zápisem.

JavaScript
import { writeFileSync, readFileSync } from 'node:fs'

// Zápis
const jsonOutput = JSON.stringify(rows, null, 2)
writeFileSync('zamestnanci.json', jsonOutput, 'utf8')

// Načtení zpět
const parsed = JSON.parse(readFileSync('zamestnanci.json', 'utf8'))
console.log(Array.isArray(parsed))  // true
console.log(parsed[0].name)         // "Jan Novák"

Související nástroje

Dostupné také v:Python
AC
Alex ChenFront-end & Node.js Developer

Alex is a front-end and Node.js developer with extensive experience building web applications and developer tooling. He is passionate about web standards, browser APIs, and the JavaScript ecosystem. In his spare time he contributes to open-source projects and writes about modern JavaScript patterns, performance optimisation, and everything related to the web platform.

SL
Sophie LaurentTechnický recenzent

Sophie is a full-stack developer focused on TypeScript across the entire stack — from React frontends to Express and Fastify backends. She has a particular interest in type-safe API design, runtime validation, and the patterns that make large JavaScript codebases stay manageable. She writes about TypeScript idioms, Node.js internals, and the ever-evolving JavaScript module ecosystem.