Developer

Convert JSON to CSV

Paste an array of objects and get a CSV back. The columns are the union of every key that appears, in the order they first show up, so rows with missing fields leave blanks instead of shifting everything sideways. Quoting follows RFC 4180: fields containing the delimiter, a quote or a line break get wrapped, and inner quotes are doubled.

Excel in a locale that uses the comma as a decimal separator expects semicolons. If your columns arrive squashed into one, this is why.

Output

Flattening turns address.city into its own column. Arrays stay as JSON text in a single cell either way.

0Rows
0Columns
0CSV size

CSV is a habit, not a standard

RFC 4180 was published in 2005 and describes itself as informational. It documents what most people were already doing rather than telling anyone what to do, and plenty of software ignores it. That is why importing a CSV so often needs three attempts. The rules this tool follows are the RFC ones, because they are the closest thing to a common denominator:

Fields with leading or trailing spaces are quoted here too. The RFC does not require it, but a lot of parsers strip unquoted whitespace and you rarely want that.

Turning a tree into a rectangle

This is the part that cannot be done cleanly, only chosen. JSON nests; CSV does not. Three cases and what happens to each:

Columns are the union of every key across every row, in first-seen order. A row missing a key gets an empty cell, which is why the row count and column count stay stable even when your objects are not.

The Excel problems

Three things go wrong between a correct CSV file and a correct spreadsheet, and none of them is the file's fault.

Encoding. Excel on Windows still reads a plain .csv using the system's legacy code page, so José arrives as José. A UTF-8 byte order mark at the start of the file tells it otherwise, which is why that checkbox exists and defaults to on. The BOM only goes into the downloaded file, never into the copied text, because everything else in the world treats it as junk.

Types. Opening a CSV by double-clicking it lets the spreadsheet guess. Leading zeros vanish, so the ZIP code 01234 becomes 1234. Long numeric IDs turn into scientific notation and lose their last digits. Anything shaped vaguely like a date becomes a date, in the locale's format. Use Data, then From Text/CSV, and set the awkward columns to Text during the import instead.

Formulas. A cell whose text begins with =, +, @ or a tab is evaluated as a formula rather than shown. That is CSV injection, and it is a genuine attack route when the data came from users. This tool counts those fields and warns you, but it does not neutralise them, because the usual fix — prefixing an apostrophe — corrupts the value for every non-spreadsheet consumer of the same file. Decide based on where the file is going.

What is missing

There is no streaming. The JSON, the parsed value and the finished CSV all sit in memory at once, so a few megabytes is comfortable and a hundred is not. Numbers are written the way JavaScript prints them, which means an integer beyond 2^53 has already lost precision before this tool sees it. And null and the empty string both come out as an empty cell — CSV has no way to tell them apart, so the distinction does not survive the trip.

Frequently asked questions

What shape does my JSON need to be?

An array of objects is the normal case, one object per row. A single object also works and produces one row. An array of plain values becomes a one-column table headed "value". Anything else has no rows in it and is rejected.

Why are my columns all crammed into cell A1?

Your spreadsheet expects a different delimiter. Excel follows the system list separator, which is a semicolon in most of Europe and Latin America. Switch the delimiter to semicolon and reopen the file.

Should I keep the UTF-8 BOM?

Keep it if the file is going to be opened in Excel on Windows. Drop it if the file is going into a script, a database loader or a Unix pipeline, where those three extra bytes can turn up glued to the first column name.

Can I get one row per item in a nested array?

Not here. That would mean duplicating every parent field across the child rows, and the tool cannot tell which array you meant to expand. Split the data into a parent table and a child table with a shared id, then convert each one.

Is the data sent to a server?

No. Parsing, flattening, quoting and the download all happen in this tab. The downloaded file is built from a blob in memory and never leaves your machine.

Last updated September 19, 2026