dataeng.tools

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

JSON is a document format: hierarchical, self-describing, and typed, with numbers, booleans, nulls, strings, and arbitrarily nested objects and arrays. CSV is the opposite — a flat, untyped grid of rows and columns. Converting JSON to CSV is the act of forcing a list of records into that grid, usually so a spreadsheet, a bulk loader, a warehouse COPY command, or a colleague can consume it without a JSON parser. The shape that maps cleanly is a top-level array of objects (or one object per line): each object becomes a row, and the set of keys across those objects becomes the columns.

The keys become your header. Records don’t have to agree on their keys — the column set is the union of every key seen across the array, and any object missing a given key is written as an empty field, not a zero or a literal null. Nested values are where the model breaks down: an object or array has no tabular equivalent, so a value like {"a":1} collapses into a JSON string inside a single cell rather than exploding into its own columns. Everything also loses its type on the way out — CSV is just text, so JSON’s number, boolean, and null distinctions are gone once written.

A header row is included, and string values containing commas, quotes, or newlines are quoted and escaped so the grid stays parseable. One thing to check up front: if your input isn’t a top-level array of objects — say it’s a single object, or the records are buried under a wrapper key — only the outer level flattens, so point the tool at the array you actually want as rows. Because JSON repeats every key on every record while CSV writes each key once in the header, the CSV is often smaller than the JSON it came from. It all runs locally in your browser via DuckDB-WASM; the file 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 can't become columns — CSV has no nested type — so each nested value is serialized to a JSON string inside a single cell. If you need the structure kept or split into separate columns, keep it as JSON/JSONL or pre-flatten the keys before converting.
What if my records don't all have the same keys?
The column set is the union of every key seen across the array. A record missing a key just gets an empty field for that column, so ragged or heterogeneous objects still line up — you get gaps where keys were absent rather than an error.
My JSON is a single object or wrapped under a key, not an array — will it convert?
Rows come from an array of objects: a single object yields one row. If your records are nested under a wrapper key, only the outer level is treated as columns, so target the inner array you want as rows — otherwise that nested content ends up as JSON strings in cells.
Is my file uploaded anywhere?
No. The JSON→CSV 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