Skip to content
Developer · Data

JSON to CSV Converter

Convert a JSON array of objects into a clean, downloadable CSV file — entirely in your browser. Supports nested objects, JSONLines, and a live preview before you download.

In-browser only RFC 4180 CSV FileReader API
All processing runs in your browser — your data is never uploaded.

Guide

How to convert JSON to CSV

  1. 1
    Choose your input source

    Use the Paste / File / URL segmented control to select how your JSON arrives. Paste works for clipboard content; File accepts drag-and-drop or click-to-browse; URL fetches any public JSON endpoint.

  2. 2
    Provide your JSON

    Accepted formats: an array of objects, a single object, or JSONLines with one object per line. Nested objects are automatically flattened using dot-notation.

  3. 3
    Adjust advanced options (optional)

    Open the Advanced options section to change the delimiter (comma, semicolon, tab, or pipe), enable a UTF-8 BOM for Excel compatibility, or toggle the header row on or off.

  4. 4
    Click Convert

    A scrollable preview table appears immediately with all columns and rows. Column headers reflect dot-notation keys for any nested properties (e.g. address.city).

  5. 5
    Download or copy

    Click Download CSV to save a .csv file named with today's date, or use the Copy button to put the full CSV text onto your clipboard.

  6. 6
    Open in any spreadsheet

    The downloaded file is RFC 4180-compliant and opens without issue in Excel, Google Sheets, or any database import wizard.

Examples

Input and output examples

Flat array input
[{"name":"Alice","age":30},
 {"name":"Bob","age":25}]

Produces 2 columns and 2 data rows. Column order follows first-object key order.

Flat array output
name,age
Alice,30
Bob,25

RFC 4180 format. Values containing commas or quotes are automatically wrapped in double-quotes.

Nested object input
[{"user":{"name":"Alice"},
  "tags":["admin","dev"]}]

The user object is flattened; the tags array is serialized as a JSON string in one cell.

Nested object output
user.name,tags
Alice,"[""admin"",""dev""]"

Dot-notation keys for nested scalars. Arrays become RFC 4180-escaped JSON strings.

Frequently asked questions

What JSON formats does the converter accept?
Three formats are supported: a JSON array of objects ([{…},{…}]), a single JSON object ({…}) which produces a one-row CSV, and JSONLines / NDJSON where each line is a separate JSON object. Invalid JSON is caught immediately with a specific error message.
How are nested objects handled?
Nested objects are flattened recursively using dot-notation keys — for example, {"address":{"city":"Austin"}} produces a column named address.city. Nesting is supported up to 10 levels deep; beyond that, the value is serialized as a compact JSON string. Arrays within objects are always serialized as JSON strings in a single cell.
Is my data uploaded to a server?
No. All parsing, flattening, and CSV generation runs locally in JavaScript within your browser tab. Your data never leaves the device — not even temporarily. The only outbound request that can occur is the URL-fetch mode, and only to the address you specify.
Why does my CSV look wrong when I open it in Excel?
Two common causes: Excel in some locales expects a semicolon delimiter instead of a comma — switch to Semicolon (;) in Advanced options. For character encoding issues with non-ASCII text (accented characters, CJK), enable the UTF-8 BOM toggle, which signals to Excel that the file is UTF-8 encoded.
Is there a file size limit?
File uploads are limited to 5 MB, enforced before the file is read into memory to avoid browser lag. The limit applies only to file uploads; pasted text and URL-fetched JSON have no strict size cap, though very large payloads may take a second or two to process.
What is the URL fetch mode, and does it work for any endpoint?
URL mode uses the browser's fetch() API to retrieve JSON from a public endpoint. It works only for servers that send permissive CORS headers — private or same-origin APIs are unreachable from a browser page on a different origin. If the request fails due to CORS, a clear error message is shown.
What if objects in the array have different keys?
All unique keys across every object in the array are collected and used as headers. Objects that do not have a particular key produce an empty cell for that column. This mirrors how most spreadsheet import tools handle sparse data.