dataeng.tools

Convert Parquet to JSONL — Free, Private, In-Browser

Parquet to JSONL is the conversion you reach for when the next system consumes records line by line rather than a single document. Each Parquet row becomes one JSON object on its own line — newline-delimited JSON, sometimes called NDJSON — with no enclosing array and no commas between records. That framing is the whole point: you can append to the file, split it across workers, or stream it a line at a time without ever holding the full result in memory. It's the native shape for log shippers, Kafka producers, Elasticsearch bulk loads, BigQuery and Snowflake newline-delimited loaders, and any tool that reads one record, processes it, and moves on.

Unlike a flattening to CSV, JSONL keeps your Parquet's shape intact. STRUCT columns serialize to nested JSON objects and LIST columns to JSON arrays, so a column of addresses or an array of tags round-trips as real structure rather than a stringified blob. Scalar types map to their JSON equivalents: INTEGER and DOUBLE become bare numbers, BOOLEAN becomes true/false, VARCHAR becomes a string, and NULLs become JSON null. Because every line is a complete, self-contained object, each one is independently parseable — a malformed record doesn't poison the rest of the file, which is exactly what you want feeding an ingestion pipeline that commits row by row.

A few types don't have a JSON home. DATE, TIME, and TIMESTAMP have no native representation, so they serialize to strings — ISO-8601 text you'll likely need to cast back on the way in. Big integers are the classic trap: JSONL emits them as bare numbers, but many parsers (JavaScript's JSON.parse foremost) read JSON numbers as IEEE doubles and silently lose precision above 2^53, so large BIGINT IDs are safer treated as strings downstream. DECIMALs and BLOBs also need a plan, since JSON has neither. All of it runs locally in your browser via DuckDB-WASM — your Parquet file is never uploaded.

Drop a file or click to browse

Drop a Parquet file — processed locally, never uploaded

Frequently asked questions

JSONL or a single JSON array?
This page emits JSONL — one JSON object per line, with no enclosing array and no commas between records. That's what streaming and log/ingestion systems want, because they can read and commit a line at a time without buffering the whole file into memory. If you need a single array instead (for JSON.parse or an API request body), use the Parquet to JSON converter.
Do STRUCT and LIST columns survive?
Yes. Unlike CSV, JSONL preserves nesting — STRUCT columns become nested JSON objects and LIST columns become JSON arrays, so the shape of each row is retained rather than flattened to a stringified blob. This is the main reason to prefer a JSONL target over CSV for nested Parquet data.
How are timestamps and big integers handled?
JSON has no date type, so DATE and TIMESTAMP columns serialize to ISO-8601 strings you may need to cast on re-ingest. Integers are written as bare JSON numbers; because many parsers treat those as IEEE doubles, BIGINT values above 2^53 can lose precision, so very large IDs are safer carried as strings downstream.
Is my file uploaded anywhere?
No. The Parquet→JSONL conversion runs entirely in your browser via DuckDB-WASM. Your file never leaves your device.
How large a file can I convert?
It's bounded by your browser's available memory rather than any server limit — files in the hundreds of MB are routine. DuckDB runs single-threaded here, so very large files just take a little longer.
Do I need an account?
No — it's free and requires no sign-up.

Do more with your Parquet file

Related conversions