Skip to content
Tools

JSON to CSV Converter

Convert JSON data into CSV format instantly with support for nested objects, arrays and large files. Everything runs locally in your browser.

Visible pane
Output view
0 × 0

Paste JSON or upload a .json file to convert it into CSV.

Waiting for JSON

Everything happens locally in your browser. Your data is never uploaded.

What is JSON to CSV?

JSON is a tree. It nests to any depth, it has real types, and a record can hold a list inside one of its fields. CSV is a rectangle: rows and columns, every cell a piece of text, nothing inside anything else.

Converting one to the other means flattening a tree into a rectangle. That is entirely possible, but it is not free — and the whole job is deciding what happens to the parts that do not fit.

A nested record becomes a flat row
{ "id": 1, "user": { "name": "Ada" }, "tags": ["a", "b"] } id,user.name,tags1,Ada,"a, b"

Notice the two decisions that were made there: the nested object became a user.name column, and the array became one quoted cell. Both are options here rather than hidden defaults, because the right answer depends on what is going to read the file.

Why convert JSON to CSV?

Because the people and the programs that need the data often cannot use JSON. Spreadsheets do not open it. Analysts do not want to read it. Import tools rarely accept it. CSV is the format that everything, everywhere, has understood for forty years.

It is also the fastest way to look at data. A JSON array of two hundred records is a wall of punctuation; the same records as a table can be sorted, scanned and totalled in seconds. That is why this tool shows the result as a table first and the raw CSV second — the table is usually the point.

The trade is real, though: CSV loses types, loses nesting, and has no way to represent a list inside a cell. It is worth being deliberate about what you are giving up, which is what the options are for.

How JSON to CSV conversion works

  1. 1. The JSON is validated. Nothing is converted until the document parses. If it does not, the error names the line, the column and what the parser expected, and one click puts the cursor there. For a document that needs more than one fix, the JSON formatter is the easier place to repair and re-indent it first.
  2. 2. The records are identified. An array is the records. A single object is one record. An envelope such as { data: [ … ] } is unwrapped to the array inside.
  3. 3. Each record is flattened. Nested objects become dotted column names; arrays become a single cell in whichever form you chose.
  4. 4. The columns are collected. The column list is the union of every key across every record, so a key that appears in only one record still gets a column — and every other row gets an empty cell for it.
  5. 5. The columns are ordered. First-seen order by default, alphabetical, or an explicit order you supply.
  6. 6. The rows are written. Each cell is quoted if it contains the delimiter, a quote, a line break or edge whitespace, with inner quotes doubled — exactly as RFC 4180 requires.

Supported JSON structures

An array of objects

The natural fit, and what most APIs return. Each object is a row and each key is a column. This is the shape CSV was designed for.

[{ "id": 1, "name": "Ada" }, { "id": 2, "name": "Grace" }]

A single object

Becomes one row, with each key a column. Useful for turning a configuration file or a single API record into a spreadsheet line.

{ "id": 1, "name": "Ada", "active": true }

Nested objects

Flattened into dot-notation columns to any depth, so the structure is visible in the column name rather than lost.

{ "user": { "address": { "city": "Osaka" } } }  →  user.address.city

Nested arrays

Written into a single cell, in whichever of the four ways you choose — joined, as JSON, or first value only. A cell cannot hold a list, so this is a decision the format forces.

{ "tags": ["priority", "renewal"] }  →  "priority, renewal"

An API envelope

Unwrapped automatically. A response like { data: [ … ] } is almost always a wrapper around the records you actually want, so the array inside is what gets converted.

{ "data": [ … ], "page": 1, "total": 24 }  →  the 24 records

Flattening nested JSON

A CSV column name is a single string, so a nested path has to be written into one. The convention is dot notation: each level of nesting is joined to the next with a full stop.

Three levels become three dotted columns
{  "id": 1001,  "customer": {    "name": "Mei Tanaka",    "address": { "city": "Osaka", "country": "Japan" }  }} id,customer.name,customer.address.city,customer.address.country1001,Mei Tanaka,Osaka,Japan

This is the same notation the CSV to JSON converter reads back, so a document flattened here can be rebuilt into the original nested shape there. That round trip is the reason to prefer dot notation over inventing a separator of your own.

Arrays are the one thing dot notation cannot express, because a column name cannot describe a variable number of values. That is why arrays are a separate option rather than part of flattening — a cell has to hold one value, so a list has to become one.

If you would rather not flatten at all, turn it off and each nested value becomes a single JSON cell. That keeps the structure intact at the cost of being much harder to read in a spreadsheet.

Common use cases

API responses

Capture a response, convert it, and hand a spreadsheet to someone who is never going to read JSON.

Database exports

A JSON dump becomes a table you can filter and pivot, without writing a query or installing anything.

Excel imports

Excel does not read JSON. It reads CSV very happily — switch the delimiter to semicolon if your copy expects it.

Google Sheets

Import the CSV directly, or paste it in. Comma with LF line endings is the safest combination.

Business reports

Stakeholders want rows and totals, not nested objects. Flatten once and the numbers are ready to chart.

Analytics

Most analysis tools — pandas, R, BI dashboards — take CSV as their most reliable input format.

Data migration

CSV is the lowest common denominator between two systems that share nothing else, and every importer understands it.

JSON vs CSV

Neither is better. They are good at different things, and knowing which is which saves a great deal of arguing.

JSON

  • Nests to any depth
  • Has real types — numbers, booleans, null
  • Records can have different keys
  • A field can hold a list or an object
  • Verbose: every key is repeated in every record
  • Awkward to read in bulk without a viewer

Use it between programs, and wherever structure matters.

CSV

  • Flat — rows and columns only
  • Everything is text; types are inferred by the reader
  • Every row has the same columns
  • A cell holds exactly one value
  • Compact: column names are written once
  • Opens in every spreadsheet on earth

Use it between a program and a person, and for anything tabular.

The practical rule: if the data is already a table, CSV is better. If it genuinely nests — an order with line items, a user with permissions — JSON is better, and flattening it to CSV will cost you something. Decide which of those you have before converting, and the options here will make sense immediately.

Frequently asked questions

Is this JSON to CSV converter free?

Yes. Conversion, file upload, the interactive table, every option and the download are free, with no account, no sign-up and no limit on how many files you convert.

Is my JSON uploaded anywhere?

No. The JSON is parsed and converted by JavaScript running in your browser. Nothing is sent to a server, nothing is stored and nothing is logged. You can disconnect from the network after the page loads and it keeps working — which matters, because the data people convert is usually an API response or a database export.

Can I convert nested JSON?

Yes. Nested objects are flattened using dot notation, so { "user": { "name": "Ada" } } becomes a column called user.name. This works to any depth — user.address.city is fine — and the flattening is a single iterative pass, so a deeply nested document cannot overflow anything.

What happens to arrays inside a record?

You choose. An array can be joined with commas or semicolons, written as a JSON string, or reduced to its first value. Joining is the default because it is the most readable in a spreadsheet; the JSON string option is the one to pick if the data has to survive a round trip back into JSON.

Can I upload JSON files?

Yes. Use the upload button or drag a .json file anywhere onto the tool. Files up to 20 MB are read locally with the browser's FileReader as UTF-8, so accented and non-Latin characters survive. The file name is reused when you download the CSV.

Can I choose the delimiter?

Comma, semicolon, tab and pipe are all supported. Semicolon is worth knowing about: spreadsheet software configured for most of Europe expects it, because the comma is the decimal separator there, and a comma-separated file will open as a single column on those machines.

Will the column order be preserved?

By default yes — columns appear in the order their keys are first seen across the records. You can also sort them alphabetically, or give an explicit order one column per line. Anything left out of a custom order is appended rather than dropped, so a custom order can never silently lose a column.

What if some records have different keys?

The columns are the union of every key across every record. A record that does not have a particular key gets an empty cell for it, so nothing is lost and every row has the same width — which is what makes the result a valid table.

What do empty values become?

Blank by default, or NULL, or any custom text you choose. The same setting covers three different things a spreadsheet cannot tell apart: a null, an empty string, and a key the record simply does not have.

Does it support large JSON files?

Yes. Documents up to about 20 MB are handled comfortably. Parsing runs in a background worker so typing stays responsive, and the preview table only renders the rows currently on screen, so a table with tens of thousands of rows scrolls smoothly. Very wide or very long documents stop at an internal ceiling and the status bar says so rather than quietly truncating.

Can I download the converted CSV?

Yes. The download button saves a .csv file named after the JSON file you opened, or converted.csv if you pasted the data. You can also copy the whole CSV to the clipboard, or copy an individual cell, row or column from the table.

Why are some values wrapped in quotes?

Because they contain something that would otherwise break the file — the delimiter, a double quote, a line break, or leading and trailing spaces. Quotes inside a quoted value are doubled, which is how RFC 4180 escapes them. You can also quote every value, but you cannot turn quoting off entirely: a value containing the delimiter has to be quoted or no reader could parse the file back.

What JSON structures can it convert?

An array of objects is the natural fit and converts directly. A single object becomes one row. An array of scalars becomes a single column. And an API envelope such as { "data": [ … ] } is unwrapped automatically, because the array inside is almost always what you actually want.

Can I search and sort the result?

Yes. The search finds text in both column names and values, highlights every match, counts them and steps through them with previous and next. Clicking a column header sorts by that column — numerically when the values are numbers — and clicking a third time restores the original order.

Will the CSV open correctly in Excel or Google Sheets?

Yes. The output follows RFC 4180, which both understand. If Excel opens the file as a single column, its locale expects semicolons — switch the delimiter to semicolon and it will open correctly. For Google Sheets, comma with LF line endings is the safest combination.

Are there keyboard shortcuts?

Ctrl/Cmd+Enter converts immediately, Ctrl/Cmd+Shift+C copies the CSV, Ctrl/Cmd+Shift+D downloads it, Ctrl/Cmd+Shift+L loads another sample and Ctrl/Cmd+Shift+Delete clears the input. Ctrl/Cmd+F opens the search, and Escape closes it.

Popular tools

↑ ↓NavigateOpenEscClose