JSON to CSV
Convert JSON to CSV, nested objects included
Free JSON to CSV converter, no signup, nothing uploaded. Drop a JSON array or JSON Lines file up to 1.5 GB; nested objects flatten 4 levels deep into columns like address.city, press Export and download a CSV with a header row. 250 countries as 1.3 MB of nested JSON became a 0.5 MB CSV.
No file handy? Open Every country, as nested JSON (250 rows, 1.4 MB).
How nested JSON becomes columns
A flat array of objects is the easy case: every key is a column, every object is a row. Nested objects are flattened into dot-path columns, so {"address": {"city": "Rotterdam"}} gives a column named address.city. Flattening goes 4 levels deep and stops at 200 columns; what is left stays as JSON text in one column.
Arrays are not exploded into rows. An array value is written to the CSV cell as JSON text, like ["nl","en"], so a row stays a row. Strings that themselves contain JSON are parsed and flattened too, when at least 90% of a 1,000-row sample parses.
Which JSON shapes work
An array of objects ([{...}, {...}]), one object per line (JSON Lines, NDJSON), or a single object. A wrapper like {"items": [...]} opens as one row with the array in a cell; unpack it with SELECT unnest(items, recursive := true) FROM data and export the result.
Keys that are missing on some objects become empty cells. Types are detected per column across the file (whole file up to 50 MB, sampled above that), so 42 stays a number and "42" stays text.
Pick rows and columns before you export
Export writes the current view. Filter with region:Europe or population:>1000000, hide the columns nobody needs, sort by clicking a header, and the CSV follows. A plain filter has no row cap; SQL results stop at 1,000,000 rows.
Renaming is a one-line query: SELECT name.common AS country, capital[1] AS capital, population FROM data. The export takes the column names of the result.
What lands in the CSV
UTF-8, comma separated, a header row, values quoted when they contain commas, quotes or line breaks. null becomes an empty cell, booleans are written as true and false, numbers without quotes. Text that starts with =, +, - or @ gets a leading apostrophe so a spreadsheet won't execute it.
Need the other direction, or a different output? The same Export menu writes JSONL, Parquet with zstd compression and a Markdown table of the first 1,000 rows.
Big files, scripts and links
The ceiling is 1.5 GB per file, because everything runs in the memory of your tab. For a repeatable job use DuckDB on your machine: duckdb -c "COPY (SELECT * FROM read_json('data.json')) TO 'data.csv' (HEADER)" does the same flattening.
To pass the data on, press Share or run curl -T data.json https://rows.page. The link opens the table for anyone, the original file stays downloadable at /raw.json, and anonymous links are deleted after 7 days unless you keep them.
Limits for converting JSON to CSV
| What | Limit or price |
|---|---|
| Open in the browser | JSON and JSONL files up to 1.5 GB, $0, no account |
| Nesting | Objects flatten up to 4 levels deep, at most 200 columns |
| Arrays | Written as JSON text inside the CSV cell |
| Output | CSV with a header row, UTF-8, formula-safe cells |
| Rows | No cap through filters; SQL results export the first 1,000,000 rows |
| Share a link without an account | $0, files up to 100 MB, link deleted 7 days after creation |
| Free account | $0, 10 datasets kept, last 3 versions |
| Pro | $12/month, 100 datasets, files up to 500 MB, private links |
| Max | $39/month, 1,000 datasets, files up to 2 GB, private links |
Questions
Is my JSON uploaded?
No. Opening a file reads it inside your browser tab. It only leaves your machine if you share it or push it with curl.
What if my objects have more than 200 keys?
Flattening stops at 200 columns and 4 levels. Deeper or wider parts stay as JSON text in a column, and you can still pull single fields out with SQL, for example SELECT json_extract_string(extra, '$.id') AS id FROM data.
Does it convert JSON Lines or NDJSON?
Yes, the same converter reads .jsonl and .ndjson files. There is also a dedicated JSONL to CSV page if you came for that.
Can I turn an array of arrays into rows?
Open the file, then run SELECT unnest(items) FROM data (or unnest(items, recursive := true) to spread the inner objects into columns) and export the result.
How do I convert JSON to CSV from a script?
The conversion runs in the browser, not on a server. For scripts, DuckDB does the same on your machine: COPY (SELECT * FROM read_json('data.json')) TO 'data.csv' (HEADER).
More tools
- CSV viewerOnline CSV viewer for big files
- Parquet viewerParquet viewer, no Python needed
- JSONL viewerJSONL viewer for logs, evals and traces
- JSON to tableJSON to table, nested fields included
- Past Excel's row limitExcel stops at 1,048,576 rows. Open the rest here.
- CSV to ParquetConvert CSV to Parquet in your browser
- Parquet to CSVConvert Parquet to CSV in your browser
- CSV to JSONConvert CSV to JSON or JSON Lines
- JSONL to CSVConvert JSONL to CSV in your browser
- TSV to CSVConvert TSV to CSV in your browser
- CSV to MarkdownTurn a CSV into a Markdown table
- SQL on CSVRun SQL on a CSV file in your browser
- Share a CSVShare a CSV as a link, not an attachment
- Version control for CSVVersion control for CSV files, without git
Pushing data from a script or agent? Read the docs.