CSV to JSON converter. Auto-detect, type-infer.
Paste CSV or drop a file. We auto-detect the delimiter, treat the first row as headers (toggle off if not), and infer types for numbers / booleans / nulls. Output as JSON array or NDJSON. Browser-only.
Paste CSV or drop a file. We auto-detect the delimiter and treat the first row as headers. Output renders as a JSON array; toggle NDJSON for line-by-line streaming consumers. Type inference coerces strings to numbers / booleans / nulls. Powered by PapaParse (MIT).
// JSON output appears here
Sources used
Privacy: parsing happens in your browser. Nothing is sent or logged.
Two output formats. Different consumers.
JSON array. The whole dataset wrapped in [ ... ]. The default for any consumer that loads the entire structure into memory at once — most APIs, browser-side JavaScript, small-to-medium datasets. Pretty-printed for human readability. Trade-off: slower to parse on very large files because the parser has to read the entire array before yielding anything.
NDJSON / JSON Lines. Each row as an independent JSON object on its own line. Used by streaming pipelines — pipe through jq for filtering, post one row at a time to a webhook, load into BigQuery / Snowflake / DuckDB without a wrapping array. Use NDJSON when the consumer reads line-by-line; use the array when the consumer wants the whole structure at once. Most modern data pipelines prefer NDJSON for files over a few MB.
With or without headers. First-row-as-header gives you objects keyed by column name ({"name": "Alice", "age": 28}). Without headers, each row is an array (["Alice", 28]). Object form is more readable and self-documenting; array form is smaller on the wire and faster to parse for downstream consumers that already know the schema.
Four jobs this tool covers.
Job 1: Convert a one-off export. Sales team sent you a CSV from their CRM; engineering needs JSON for the import script. Paste, copy, paste. Faster than spinning up a Python script with pandas just to convert one file.
Job 2: Inspect a CSV's structure. When you receive a CSV from a partner and need to confirm the schema before writing the import code, paste here. The status panel shows the row count, column count, detected delimiter, and inferred types per column — enough to draft the import without running it. Pair with our JSON Validator for the structure stats on the JSON output.
Job 3: Prepare data for an LLM training set. NDJSON output is the canonical format for fine-tuning datasets across most providers (OpenAI, Anthropic). Convert your CSV training data here, download as .ndjson, upload to the fine-tuning endpoint. Beats writing the conversion in Python.
Job 4: Bulk-import to a NoSQL database. MongoDB, DuckDB, BigQuery all accept NDJSON for bulk import. Convert here, download, run mongoimport --type=json --jsonArray=false or equivalent. The browser conversion handles up to ~50MB cleanly; for larger files use PapaParse in a Node script.
Six questions users ask.
How does delimiter auto-detection work?
PapaParse counts the occurrence of comma, tab, semicolon, and pipe on the first 10 lines and picks whichever is most consistent across rows. Comma is the standard; tab is common in TSV exports; semicolon is the European convention (used by German / French Excel); pipe is rare but appears in legacy database exports. If auto-detect picks the wrong one, switch to a manual delimiter from the chip bar.
What's NDJSON output good for?
NDJSON (Newline-Delimited JSON, also called JSON Lines) writes each row as an independent JSON object on its own line. Used by streaming consumers — you can pipe each line through jq, post one row at a time to a webhook, or load into BigQuery / Snowflake / DuckDB without a wrapping array. Use NDJSON when the consumer reads line-by-line; use the JSON array when the consumer wants the whole structure at once. Most modern data pipelines prefer NDJSON for files over a few MB.
What does type inference do?
Without inference, every cell is a string. With inference on, we coerce: '42' becomes the number 42, '3.14' becomes 3.14, 'true'/'false' become booleans, empty strings become null, 'null' becomes null. Useful when the CSV is destined for a strongly-typed downstream consumer (a database, an API). Toggle off if your downstream system expects every value as a string — common when dealing with phone numbers, ZIP codes, or product IDs that look numeric but should stay textual.
How are quoted strings handled?
Per RFC 4180. Cells containing a comma, newline, or quote must be enclosed in double quotes; embedded double quotes inside a quoted cell are escaped by doubling them (""). PapaParse handles all three cases natively. So a cell like 'O"Brien, John' would appear in CSV as "O""Brien, John". The parser un-escapes the quotes correctly.
Why does the parse fail on my file?
Most common causes: (1) BOM character at start (we strip it automatically). (2) Inconsistent quoting — some rows use quotes, some don't, and a stray quote breaks parsing. (3) Different number of columns per row — common in hand-edited CSV. (4) Mixed line endings (CRLF vs LF). (5) Different delimiter than auto-detected. The error message in the verdict panel usually points at the row number; check that row in the source.
Is the data I paste sent anywhere?
No. PapaParse runs entirely client-side. The page is static HTML; the only network request is the initial page load (which fetches PapaParse from jsDelivr CDN). Safe for customer data, financial records, internal exports — anything you wouldn't want uploaded to a third-party service.