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.

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

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.

  1. Narrow the table if you only need part of it: type a filter such as country:NL or price:>20, or click a histogram bar or top value in the Columns panel.
  2. Or type SQL that starts with SELECT, WITH or FROM into the same box; the table is called data.
  3. Hide the columns you don't want, because the export writes your current view.
  4. 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:

json
{"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:

sql
SELECT
  id,
  "user.name" AS user_name,
  "user.address.city" AS city,
  tags
FROM data
WHERE created_at >= '2026-01-01'
ORDER BY __rid

The 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:

sql
SELECT * REPLACE (strftime(created_at, '%Y-%m-%dT%H:%M:%S') AS created_at)
FROM data
ORDER BY __rid

JavaScript'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:

sql
COPY (SELECT * FROM 'in.parquet') TO 'out.json' (FORMAT json, ARRAY true);

Leave out ARRAY true to get JSONL, one object per line:

sql
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.

python
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.

JSON vs JSONL output
OutputShapeBest for
JSONOne array of objectsSmall exports, web APIs and tools that expect a single JSON document
JSONLOne object per lineLarge 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

WhatLimit or price
Open a file in your browserFiles 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.