Convert CSV to JSON
A real RFC 4180 parser, not a split on commas. Quoted fields with commas and line breaks survive, the delimiter is detected, and dotted column names become nested objects again.
Paste some CSV, or drop a .csv file onto the box.
Splitting on commas is not parsing
Almost every broken CSV import traces back to the same shortcut. A field containing a comma is legal — it is wrapped in double quotes. A field containing a line break is legal too, wrapped the same way. A double quote inside a quoted field is written as two double quotes. Splitting the text on commas gets all three wrong, and the failure is invisible until one row of real data contains a company name with a comma in it and every column after that point shifts by one.
This page implements the actual RFC 4180 grammar: it walks the text character by character, tracking whether it is inside quotes, and handles doubled quotes, embedded newlines, CRLF and LF line endings, and a UTF-8 byte order mark at the start of the file. That last one is why a spreadsheet exported from Excel so often produces a first column named something like id with an invisible character stuck to it.
The delimiter is not always a comma
Anywhere that uses a comma as the decimal separator — most of continental Europe — Excel exports CSV with semicolons instead. Tab-separated files are common out of databases, and pipes turn up in older systems. Getting this wrong does not produce an error; it produces one enormous column, which people then spend twenty minutes trying to fix in the wrong place.
By default this page counts how often each candidate appears outside quoted sections in the first few lines and picks the winner. You can override it from the separator list if the guess is wrong, which mainly happens with very narrow files where the header contains punctuation.
Rebuilding nesting from column names
Flattening nested JSON into CSV produces column names that record the path — role.team, tags[0]. This page reverses that. With Rebuild nested keys on, a column called role.team becomes a team property inside a role object, and tags[0], tags[1] become an array. That makes a round trip through JSON to CSV and back structurally lossless for the common shapes, which is useful when the intermediate step was a spreadsheet somebody needed to edit by hand.
Turn it off if your column names genuinely contain full stops — 2024.revenue as a literal key, for instance — and you want them kept as flat strings.
Type detection, and the leading-zero trap
CSV has no types; everything in the file is text. With type detection on, values that look like numbers become numbers, true and false become booleans, and null becomes null. That is usually what you want, and it is also where data quietly gets destroyed.
The dangerous cases are values that look numeric but are not: US ZIP codes such as 02134, product SKUs, phone numbers with a leading plus, and long identifiers that exceed the precision of a double. This page leaves anything with a leading zero as a string, and leaves values that would not survive a round trip through a JavaScript number alone. If your data is full of identifiers, turn type detection off and coerce deliberately downstream — it is the safer default for anything going into a database.
Three output shapes
Array of objects is the normal choice and the one most APIs expect. Array of arrays keeps the raw grid, which is what you want when the header is not meaningful or the column order carries information. NDJSON writes one JSON object per line with no enclosing array — the format log pipelines, BigQuery loads and streaming parsers use, because it can be read a line at a time without holding the whole file in memory.
It stays on your machine
CSV exports are where customer lists, payroll figures and internal reports usually live. Pasting one into a site that parses it server-side is a disclosure that cannot be undone, and it is unnecessary — the parsing is a few dozen lines of code that runs perfectly well in your own browser. There is no upload, no queue and no row limit beyond your available memory.
Common questions
Why does my CSV break when a field contains a comma?
Because it needs quoting, and whatever read it split on commas instead of parsing. Quoted fields containing commas, quotes and even line breaks are all handled correctly here.
My file uses semicolons. Will it work?
Yes. The separator is detected automatically by counting candidates outside quoted sections, and you can override the guess from the list. Semicolon, tab and pipe are all supported.
What does 'rebuild nested keys' do?
It turns column names that encode a path back into structure: role.team becomes a nested object, tags[0] and tags[1] become an array. It is the exact inverse of the flattening our JSON to CSV tool does.
Why did my ZIP code lose its leading zero?
It should not here — values with a leading zero are deliberately kept as strings. If you see it happen elsewhere, that tool is coercing blindly. You can also switch type detection off entirely.
What is NDJSON and when do I want it?
One JSON object per line, no wrapping array. It is what log pipelines and bulk loaders such as BigQuery expect, because it can be streamed a line at a time instead of parsed whole.
Can it handle a large file?
There is no imposed limit; the ceiling is your browser's memory. Tens of megabytes is routine. Nothing is uploaded, so there is no waiting for a transfer either.
Is my data sent anywhere?
No. The parsing happens in this page and the file never leaves your machine. That matters more than usual for CSV, which is what most personal-data exports arrive as.