dataeng.tools

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

JSON to Parquet is one of the highest-leverage conversions in a data pipeline. JSON is verbose, loosely typed text that repeats every key on every record; Parquet is columnar, compressed, and strongly typed. DuckDB reads the JSON with read_json_auto, infers a schema, and writes Parquet from it. The payoff is large: keys are stored once as column metadata instead of on every row, each column compresses on its own, and the file usually shrinks several times over. Scans get faster because engines read only the columns they need, and the schema now travels with the file, so DuckDB, Spark, Athena, and BigQuery stop re-guessing types.

The interesting part is type inference. DuckDB samples records and picks one type per field, and this is where JSON's looseness bites. Nested objects become STRUCT columns and arrays become LIST columns, so structure survives intact — a real advantage over flattening to CSV. The traps: a field that's an integer in some records and a string in others forces DuckDB to widen to a common type, often VARCHAR, or to error; keys missing from a record become NULL; and because JSON has no date type, timestamp-looking strings land as VARCHAR unless you cast them. Ragged records with different shapes per row are where inference gets unpredictable, so eyeball the inferred schema before you trust it.

On input, the converter handles both a top-level JSON array and newline-delimited JSON (JSONL/NDJSON); a single top-level object becomes a one-row table. Large arrays are materialized in memory, so very big inputs are bounded by your browser's memory — remember DuckDB runs single-threaded here. Once written, the Parquet carries its schema plus per-column statistics, so predicate pushdown and column pruning work downstream, and every tool agrees on types instead of re-sniffing them. That typed, compressed file is what you want feeding an analytics engine or landing in object storage. It all runs locally in your browser via DuckDB-WASM — your JSON is never uploaded.

Drop a file or click to browse

Drop a JSON file — processed locally, never uploaded

Frequently asked questions

What happens to nested objects and arrays?
They're preserved, not flattened. JSON objects become Parquet STRUCT columns and arrays become LIST columns, so you can query them with dot and index notation downstream. This is the main reason to prefer a Parquet target over CSV for nested payloads.
A field has different types across records — what does DuckDB do?
It infers from a sample and widens mixed values to a common type, usually falling back to VARCHAR (or a JSON column) when integers and strings collide. If the sample misses a variant, inference can misfire — normalize the field upstream or expect a string column.
Are date and timestamp fields stored as real Parquet timestamps?
No. JSON has no date type, so date/time values arrive as strings and Parquet stores them as VARCHAR. If you need real TIMESTAMP or DATE columns, cast them explicitly before writing.
Is my file uploaded anywhere?
No. The JSON→Parquet 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 JSON file

Related conversions