How to convert JSON to CSV, free and without uploading
To convert JSON to CSV, paste your JSON into the JSON Input box, click Open JSON File, or click Load Sample to try it. The CSV Output box appears about 0.25 seconds after you stop typing, with a table preview of the first 10 rows and the Rows, Columns and Output Size boxes. Arrays of objects become rows, and nested objects become dot-notation columns such as address.city. Click Copy, or Download CSV to save converted.csv, which opens in Excel and other spreadsheet programs. The built-in sample, 3 records in 721 characters of JSON, becomes a 297-byte CSV with 3 rows and 8 columns.
It runs in your browser; nothing is uploaded (you can check the Network tab in DevTools). Files chosen with Open JSON File are read on your device. There is no account and nothing to install.
JSON to CSV conversion flattens tree-shaped JSON into the rows and columns of a table. Each object in the top-level array becomes a row and each key path becomes a column. The numbers are read as text, so an ID such as 12345678901234567890 keeps every digit instead of being rounded to the nearest floating-point value.
To go the other way, use the CSV to JSON converter. Check the input first with the JSON validator or the JSON formatter, and see the same data in other formats with the JSON to XML converter and the JSON to YAML converter.
Table of Use: how JSON becomes CSV
| In your JSON | CSV output | Note |
|---|---|---|
[{"a":1},{"b":2},{"a":3,"c":4}] | a,b,c
1,,
,2,
3,,4 | Each object is a row; the header lists every key found, and a missing key leaves an empty cell |
{"a":1,"b":{"c":2}} | a,b.c
1,2 | A nested object becomes a dot-notation column, at any depth |
"tags": ["developer","javascript","react"] | developer|javascript|react | In the first two Nested arrays options, plain values share one cell separated by | |
The same tags with Nested arrays set to Numbered columns | tags.0,tags.1,tags.2
developer,javascript,react | Each array item gets its own column; shorter arrays leave empty cells |
{"order":1,"items":[{"sku":"A","qty":2},{"sku":"B","qty":1}]} | order,items.sku,items.qty
1,A,2
1,B,1 | One row per array item repeats the parent fields for each object in the array |
{"big":12345678901234567890,"d":1.50,"e":1e3} | big,d,e
12345678901234567890,1.50,1e3 | Numbers are copied as written, so nothing is rounded or reformatted |
true, false, null | true, false, (empty) | null becomes an empty cell |
"he said \"hi\"", "x,y" | "he said ""hi""","x,y" | A cell with a quote, the delimiter or a line break is quoted, and inner quotes are doubled |
"@x" and "-5" | '@x and -5 | With Block spreadsheet formulas on, text that could run as a formula gets an apostrophe; plain numbers do not |
[[1,2,3],[4,5,6]] | column1,column2,column3
1,2,3
4,5,6 | An array inside the top-level array becomes a row of positional columns |
Features
- Four ways to handle nested arrays. One row per array item, one cell with the values joined with |, numbered columns, or the array kept as JSON text. The row-per-item mode expands arrays of objects and joins arrays of plain values.
- Delimiter choice. Comma, Semicolon (European Excel), Tab or Pipe. Choosing Tab changes the button to Download TSV and the file extension to .tsv.
- Header and column order. Tick or untick Include header row, and order the columns as they appear in the JSON or alphabetically from A to Z.
- Exact numbers and key order. A strict JSON reader replaces JSON.parse, so large integers and decimals such as 1.50 are not changed, and keys such as 2 and 1 stay in document order.
- Errors with a position. Invalid JSON is reported with its line and column, for example a trailing comma at line 1, column 9.
- Spreadsheet-friendly. A UTF-8 BOM is added to downloads by default, and Block spreadsheet formulas (=, +, -, @) guards against CSV injection.
- Preview and statistics. A table preview shows the first 10 rows, and the Rows, Columns and Output Size boxes give the exact counts. The download takes the name of the file you opened.
How to use the JSON to CSV converter
- Paste your JSON into the JSON Input box, click Open JSON File, or click Load Sample. Click Clear All to start again.
- Choose a Delimiter: Comma (,) - standard CSV, Semicolon (;) - European Excel, Tab - TSV or Pipe (|).
- Set Nested arrays and Column order, and tick or untick Include header row.
- Leave Add UTF-8 BOM to download (for Excel) ticked for Excel, and tick Block spreadsheet formulas if the data comes from people you do not know.
- Check the CSV Output, the table preview and the Rows and Columns counts.
- Click Copy, or Download CSV (Download TSV for tab-separated).
Who can use it
- Developers turning an API response into a file a colleague can open in a spreadsheet, after checking it in the JSON formatter.
- Analysts and operations teams who need an export from a tool that only offers JSON, so they can sort and filter it, and compare two exports in the text diff tool.
- Data engineers preparing a flat file for a database import, with the XML to JSON converter or the YAML to JSON converter for other source formats.
- Support teams handling customer data, which stays on their own device while it is converted.
FAQs
How do I convert JSON to CSV?
Paste your JSON into the JSON Input box, click Open JSON File, or click Load Sample to try it. The CSV Output box appears about 0.25 seconds after you stop typing, with a table preview of the first rows. Choose a Delimiter and the other options, then click Copy, or Download CSV to save converted.csv.
How are nested objects and arrays converted?
Nested objects become columns named with dot notation, so address.city holds the city inside address, at any depth. For arrays, Nested arrays offers one row per array item, one cell with the values joined by |, numbered columns such as tags.0, or the array kept as JSON text. Arrays of plain values are joined by | in the first two modes.
Will the CSV open correctly in Excel?
Yes, in most cases. Downloads start with a UTF-8 byte order mark, which Excel uses to show accents and non-Latin text correctly; untick Add UTF-8 BOM to download if another program needs a file without it. If your Excel expects a semicolon as the list separator, choose the semicolon delimiter. Excel itself keeps 15 significant digits, so a longer ID shows rounded unless you import that column as Text.
Are numbers or values changed during conversion?
Numbers are copied exactly as written, so 12345678901234567890 keeps every digit and 1.50 keeps its trailing zero; JSON.parse in a browser would round the first and shorten the second. The words true and false are written as text, null becomes an empty cell, and a value containing the delimiter, a quote or a line break is wrapped in quotes with inner quotes doubled.
What does Block spreadsheet formulas do?
A cell that starts with =, +, - or @ can be run as a formula when a spreadsheet opens the file, which is known as CSV injection. With this option on, such text gets a leading apostrophe so it displays as plain text. Plain numbers such as -5 are left alone. Turn it on when the JSON comes from users or other sources you do not control.
Why does it say my JSON is invalid?
The converter reads strict JSON, so comments, single-quoted strings, trailing commas and unquoted keys are errors, and the message names the line and column. The top level must be an object or an array, and a lone value such as 42 is rejected. An empty array, or JSON with no values at all, shows a message asking for an array of objects.
Is there a limit on rows or file size?
The tool sets no limit on file size beyond what your browser can hold, but it stops at 200,000 rows and shows an error instead of freezing the page. Split a longer array into parts to stay under the cap. If the rows come from expanding nested arrays, a Nested arrays option such as Keep as JSON text creates fewer. The error message mentions Nested arrays even for a flat list.
Is my JSON uploaded to a server?
It runs in your browser; nothing is uploaded (you can check the Network tab in DevTools). The JSON is parsed and converted by a script that ships with the page, and files chosen with Open JSON File are read on your device. Nothing is sent to ZipConvert or anyone else, so it is safe for customer lists and other private data.