Parquet to JSON
How to convert Parquet to JSON or JSONL
rows.page converts Parquet to JSON or JSONL in 2 steps, free with no signup, and exports SQL results of up to 1,000,000 rows: drop the file, then pick JSON or JSONL in the Export menu. It runs in your browser. Structs become dot-path keys; DuckDB keeps them as objects.
No file handy? Open NYC taxi trips, April 2019 (7.4M rows, 127 MB).
Convert Parquet to JSON or JSONL in your browser
Drop a .parquet file on rows.page. DuckDB-WASM reads it inside your browser, nothing is uploaded unless you press Share, and Parquet is not held to the 1.5 GB check that applies to CSV and JSON.
- Narrow the table if you only need part of it: type a filter such as
country:NLorprice:>20, or click a histogram bar or top value in the Columns panel. - Or type SQL that starts with
SELECT,WITHorFROMinto the same box; the table is calleddata. - Hide the columns you don't want, because the export writes your current view.
- Open the Export menu and choose JSON for one array of objects, or JSONL for one object per line.
A filtered view exports every matching row. A SQL result stops at 1,000,000 rows, so use a filter instead when you need more.
What the exported JSON looks like
rows.page flattens structs into dot-path columns when it opens the file (up to 8 levels deep, 200 fields per object), and the export uses those column names as keys. A Parquet row with a user struct, a tags list and a timestamp comes out like this:
{"id":1,"user.name":"Ada","user.address.city":"Utrecht","tags":["sql","json"],"created_at":"2026-01-03 10:00:00"}Lists stay real arrays, and objects inside a list keep their nesting, as in "items":[{"sku":"A","qty":2}]. Numbers, booleans and nulls keep their JSON types, and timestamps are written with a space instead of a T. To get one record back with its nesting, click the row and use Copy as JSON in the side drawer.
Rename keys and fix types with SQL before you export
In JavaScript a key like user.name needs bracket notation (row["user.name"]), so rename dot-path columns with AS while you pick the rows:
SELECT
id,
"user.name" AS user_name,
"user.address.city" AS city,
tags
FROM data
WHERE created_at >= '2026-01-01'
ORDER BY __ridThe JSON export of this result has the keys id, user_name, city and tags, in file order thanks to ORDER BY __rid. Hiding columns in the grid trims the export the same way without SQL.
Timestamps come out as 2026-01-03 10:00:00. If the reader expects ISO 8601 with a T, format the column first:
SELECT * REPLACE (strftime(created_at, '%Y-%m-%dT%H:%M:%S') AS created_at)
FROM data
ORDER BY __ridJavaScript's JSON.parse also rounds integers above 9,007,199,254,740,991, so 9007199254740993 comes back as 9007199254740992. If a browser app reads the file, turn long IDs into text with REPLACE (CAST(id AS VARCHAR) AS id).
Convert Parquet to JSON with DuckDB
DuckDB's COPY keeps structs as nested JSON objects, which rows.page does not. This writes one JSON array:
COPY (SELECT * FROM 'in.parquet') TO 'out.json' (FORMAT json, ARRAY true);Leave out ARRAY true to get JSONL, one object per line:
COPY (SELECT * FROM 'in.parquet') TO 'out.jsonl' (FORMAT json);Swap 'in.parquet' for read_parquet('data/*.parquet') to convert a folder of Parquet files into one output file.
Convert Parquet to JSONL with pandas
With pandas and pyarrow installed, one line reads the Parquet file and writes JSONL. lines=True only works with orient='records', and date_format='iso' keeps timestamps readable; without it, pandas writes them as epoch numbers.
import pandas as pd
pd.read_parquet('in.parquet').to_json(
'out.jsonl', orient='records', lines=True, date_format='iso'
)pandas holds the whole table in memory before it writes anything, so use DuckDB for large files.
JSON or JSONL: which output to pick
A JSON array wraps every record in one pair of brackets, so many parsers read the whole file before you get the first record. JSONL puts one object on each line, so you can stream it. BigQuery, for example, loads JSON data only as newline-delimited JSON.
| Output | Shape | Best for |
|---|---|---|
| JSON | One array of objects | Small exports, web APIs and tools that expect a single JSON document |
| JSONL | One object per line | Large tables, line-by-line streaming, logs and data pipelines |
Why the JSON file is bigger than the Parquet file
Expect the JSON or JSONL file to be many times larger than the Parquet file. Parquet stores typed, compressed columns, while JSON is plain text that repeats every key in every row. Filter rows and hide columns before you export, so you only write what you need.
If the JSON is only a step toward another tool, check whether that tool reads Parquet directly, as DuckDB and pandas do, and skip the conversion.
rows.page limits and prices
| What | Limit or price |
|---|---|
| Open a file in your browser | Files up to 1.5 GB, $0, no account, nothing uploaded |
| 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
Does rows.page upload my Parquet file?
No. DuckDB-WASM reads the file in your browser and nothing is uploaded unless you press Share. Sharing without an account allows 100 MB per push, and the link expires after 7 days.
How do I convert a Parquet file from a URL?
Put the public URL after rows.page/, as in https://rows.page/https://example.com/data.parquet, then export from the menu. If the host blocks cross-origin requests, rows.page fetches the file through its proxy (up to 100 MB, 30 seconds, 5 redirects).
Why does my SQL export stop at 1,000,000 rows?
SQL results in rows.page show and export up to 1,000,000 rows. To export more, use a filter instead of SQL, since a filtered view exports every matching row, or use DuckDB's COPY.
Can I pick the encoding of the exported JSON?
No, the Export menu has no encoding, delimiter or BOM option. The JSON is written as UTF-8.
Can I export a quick preview instead of the full file?
Yes. The Markdown option in the Export menu writes a table of the first 1,000 rows, with nulls as empty cells and lists as JSON text.