CSV to JSON
Convert CSV to JSON or JSON Lines
Free CSV to JSON converter, no signup, nothing uploaded. Drop a CSV up to 1.5 GB, press Export, pick a JSON array or one object per line: a 13.7 MB CSV with 50,411 rows and 79 columns became 109 MB of JSON, with numbers, booleans and dates typed instead of quoted.
No file handy? Open CO2 emissions by country and year (50k rows, 14 MB).
Array or JSON Lines
The Export menu offers both. JSON writes one array, [{...}, {...}], which is what most APIs, fixtures and front-end code expect. JSONL writes one object per line with no surrounding array, which streams, appends and splits cleanly, and is the format for fine-tuning files and log pipelines.
Same keys, same values, same order of rows. The only difference is the framing, so pick whichever the receiving side parses.
Values keep their types
DuckDB reads the CSV and detects a type per column: integers, decimals, booleans, dates and timestamps. In the JSON, 42 is a number, true is a boolean, an empty cell is null, and dates are ISO strings like 2019-04-01. Files up to 50 MB are sniffed in full; bigger ones are sampled.
If detection can't decide, every column is read as text and a note at the top of the table says so. To force a type, run SELECT CAST(code AS VARCHAR) AS code, * EXCLUDE (code) FROM data before exporting; the JSON follows the query result.
Shape the JSON before you export
Export writes the current view, so filter to status:active or amount:>100, hide the columns the consumer doesn't need, sort, and the file follows. Rename keys with SQL: SELECT id AS user_id, email FROM data.
Flat CSV, nested JSON? DuckDB builds objects: SELECT id, struct_pack(city := city, zip := zip) AS address FROM data exports as {"id": 1, "address": {"city": "Delft", "zip": "2611"}}. list_value(a, b) builds arrays the same way.
Size, and why JSON is bigger
JSON repeats every key on every row. The CO2 sample is 13.7 MB as CSV, 109 MB as a JSON array and 109 MB as JSONL, roughly 8 times the CSV. Nothing is wrong; that is the format. If the file feeds a program rather than a person, Parquet from the same menu is 4.3 MB.
The browser ceiling is 1.5 GB per input file. SQL results are capped at 1,000,000 rows, plain filters are not.
Share it or fetch it
Press Share to get a link that opens the data as a table, or run curl -T data.csv https://rows.page from a script. Anonymous links take files up to 100 MB and are deleted 7 days after creation; a free account keeps 10 datasets. The original file is served at /<id>/raw.csv with CORS headers, so a page can fetch it.
Pushing again to the same link makes a new version and the page shows how many rows are new, gone or changed.
Limits for converting CSV to JSON
| What | Limit or price |
|---|---|
| Convert in the browser | Files up to 1.5 GB, $0, no account |
| Input | CSV and TSV, delimiter and header detected, types sniffed per column |
| Output | JSON array or JSON Lines, UTF-8, typed numbers and booleans, null for empty cells |
| Rows | No cap through filters; SQL results export the first 1,000,000 rows |
| Example | 13.7 MB CSV, 50,411 rows, 79 columns: 109 MB JSON, 4.3 MB Parquet |
| 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 CSV 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.
Can I get nested JSON from a flat CSV?
Yes. Build objects in SQL with struct_pack(city := city, zip := zip) AS address and arrays with list_value(...), then export. The JSON mirrors the query result.
Why did a code column turn into numbers?
Type detection saw only digits. Cast it back before exporting: SELECT CAST(code AS VARCHAR) AS code, * EXCLUDE (code) FROM data.
JSONL, NDJSON, JSON Lines: what is the difference?
Nothing that matters. All three mean one JSON object per line. The Export menu calls it JSONL.
Does a semicolon-separated CSV from Excel work?
Yes. The delimiter is detected from the content, so semicolons, tabs and pipes work like commas.
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
- JSON to CSVConvert JSON to CSV, nested objects included
- 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.