Turn a JSON file into a table
Many apps and websites save and send data as JSON, because programs can read it quickly. People find it much harder to read, and you can't sort or filter it the way you would in a spreadsheet. A CSV file is a plain table that Excel, Google Sheets and Numbers all open without any setup.
Converting JSON to CSV gives you that table. This converter reads your JSON file and lays it out in rows and columns, using the names in your data as the column headings. Nested data, like an address stored inside a customer record, gets columns of its own, so the details don't end up hidden together in a single cell.
How to convert JSON to CSV
- Upload your JSON file - Drag it into the box at the top of this page, or browse for it. You can add up to 5 files at once, and each one can be up to 20 MB.
- Check the output - CSV is already picked on this page, so you don't need to change anything.
- Download your file - Save the .csv file when it's ready, then open it in your spreadsheet app.
Your file is uploaded and converted on our servers, which means you don't need to install anything or make an account. Our security page explains what happens to your file after that.
How your JSON turns into rows and columns
JSON can be shaped in many different ways, but a CSV is always a flat table, so the converter has to decide where each value goes. It follows these rules:
- A list of records: each record becomes a row, and each name becomes a column.
- Records inside records: the names are joined with a dot. A city inside an address becomes a column called
address.city. - A list of plain values: the values share one cell, split by a semicolon, so
["a","b"]becomesa; b. - A list of records inside a record: the first such list gives one row per item, and the record's other fields repeat on each of those rows. Any other lists of records stay as JSON text in one cell, because a single table can't split two lists at once.
- A single record on its own: you get a table with one row.
- A record that holds one list: the list's items become the rows, and the other fields repeat on each row.
{"page":1,"items":[{"id":1},{"id":2}]}gives the columnspageandid.
Columns appear in the order their names first show up in the file. If two names would make the same column, the second one gets _2 added to the end, so no data is overwritten.
A real example from our tests
On 13 November 2026 we uploaded a small file we made ourselves to our live converter. It has a nested address, a list of tags, and a ZIP code that starts with a zero:
[
{"id": 1, "name": "Ana", "address": {"city": "Lisbon"}, "tags": ["a", "b"], "zip": "01100"},
{"id": 2, "name": "Zoë", "address": {"city": "Zürich"}, "tags": [], "zip": "8001"}
]
It came back as this CSV, about 13 seconds after we started the upload:
id,name,address.city,tags,zip
1,Ana,Lisbon,a; b,01100
2,Zoë,Zürich,,8001
The address became its own column, the two tags shared one cell, and the empty list left an empty cell. The accents in Zoë and Zürich came through unchanged. You can download the JSON file we uploaded and the CSV it produced to check them yourself.
Before launch, we also ran larger files on our test server. A 19 MB file with 122,589 records took about 8 seconds, and a file with Hindi, Japanese and Arabic city names kept every character.
Opening the CSV in Excel
The CSV is saved as UTF-8 with a BOM, which is a small marker at the start of the file. The marker tells Excel how the text is stored, so accents and other alphabets don't turn into odd symbols. We checked the file itself, but we haven't tested it inside Excel yet.
Excel can still change some values when you double-click a CSV. A ZIP code like 01100 is saved correctly in the file, but Excel may show it as 1100, because it treats anything that looks like a number as a number. To keep the zero, open the file through Data, then From Text/CSV, and set that column to Text before you load it. Or convert to XLSX instead, which saves the ZIP code as a text cell, so the zero is kept in the file.
You may see an apostrophe (') at the start of some cells. The converter adds one when text starts with =, +, - or @, so that Excel shows it as text instead of running it as a formula. Plain numbers like -42 are left as they are.
Limits, and files that won't convert
- Each JSON file can be up to 20 MB. The upload box accepts bigger files, but the converter stops anything over 20 MB and asks you to split it.
- The table can have up to 1,000,000 rows, 16,384 columns and 5,000,000 cells.
- Data nested more than 64 levels deep is refused.
- JSON Lines, with one record on each line, isn't supported, because the file has to hold a single JSON value.
- The file must be UTF-8 text. UTF-16 and UTF-32 files with a BOM work too.
- NaN and Infinity aren't allowed in JSON, so a file that uses them is refused.
- A list inside another list is written into one cell as JSON text, not split up.
If your JSON has a mistake, like a comma after the last item, the error message tells you what's wrong and which line it's on, so you can fix it and upload the file again. To go the other way, CSV to JSON turns a table back into JSON.