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.

.json.jsonl
Drop a file here
Stays in your browserUp to 1.5 GB

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

WhatLimit or price
Open in the browserJSON and JSONL files up to 1.5 GB, $0, no account
NestingObjects flatten up to 4 levels deep, at most 200 columns
ArraysWritten as JSON text inside the CSV cell
OutputCSV with a header row, UTF-8, formula-safe cells
RowsNo 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

Pushing data from a script or agent? Read the docs.