JSON to CSV Converter
Convert a JSON array of objects to CSV with automatic header detection and delimiter choice. Paste JSON, download a spreadsheet-ready CSV. Nothing is uploaded.
Worked examples
- An array of flat records
The everyday case: an API response that is an array of objects becomes a CSV with one header row and one data row per item.
- Rows with a different set of keys
Real-world JSON is often inconsistent between records; the converter unions every key into the header row and leaves missing fields blank.
- Semicolon delimiter for a locale that uses comma as a decimal separator
Spreadsheet software in many European locales expects semicolon-delimited CSV so commas in numbers aren't ambiguous.
What this converter does
This tool takes a JSON array of objects — the shape almost every REST API returns for a list of records — and converts it into a CSV table, the format spreadsheets, BI tools and data-import forms expect. It parses the JSON, collects every field name used across all the rows, and writes one CSV row per object with a header row listing the union of all fields.
When you need it
- Turning an API response into a file you can open in Excel, Google Sheets or Numbers.
- Preparing data for a CSV-only import form (CRM contacts, ad platform bulk uploads, analytics tools).
- Handing a JSON export to someone who doesn't write code and just wants a spreadsheet.
- Quickly eyeballing a list of records as a table instead of scrolling through nested braces.
Rules the converter applies
- The input must be a top-level array of flat objects — something like
[{"id": 1, "name": "Ada"}, {"id": 2, "name": "Grace"}]. A single object, or an array containing anything other than objects, is rejected with an explanation. - The header row is the union of every key across every row, not just the keys in the first row. Real-world JSON often has optional fields that only appear on some records, and this avoids silently dropping columns.
- Missing fields become empty cells. If a row doesn't have a field that another row has, its CSV cell is left blank rather than the row being skipped.
- Fields containing the delimiter, a quote character, or a line break are automatically quoted per the CSV standard, so a comma inside a text value doesn't get mistaken for a column separator.
- You can choose comma, semicolon or tab as the delimiter — semicolon is the convention in several European locales where comma is used as a decimal separator, and tab is common for pasting into spreadsheet apps directly.
What this tool does not do
Nested objects or arrays inside a row ({"id": 1, "address": {"city": "Berlin"}}) are not flattened into separate columns — they're written into the CSV cell as their literal JSON text. If you need address.city as its own column, flatten the JSON to a single level before converting, or expect the nested value to appear as a JSON string inside one cell.
Things to check after converting
- Open the CSV in the target spreadsheet app and confirm the delimiter matches what that app expects by default — some regional Excel installations expect semicolons even for English-language files.
- Numeric-looking values can be reinterpreted by Excel (leading zeros dropped, long IDs turned into scientific notation) — format the column as text on import if that matters.
- Row count should match the length of your JSON array. Items that are not objects are rejected with an error rather than skipped.
- Spreadsheet apps run cell text that starts with
=,+,-or@as a formula. The tool writes values exactly as they are, so if the JSON comes from untrusted users, sanitise those cells before opening the CSV in Excel or Sheets. - The output uses CRLF line endings, as RFC 4180 specifies, with no line break after the last row.
Limits
Input is capped at 2 MB of JSON text. Extremely wide tables (hundreds of distinct field names across rows) will produce a correspondingly wide CSV, which is valid but may be unwieldy to review directly in the browser.
Frequently asked questions
- Is my JSON uploaded anywhere?
- No. The conversion runs entirely in your browser; nothing is sent to a server.
- What JSON shape does this tool expect?
- A top-level array of flat objects, like [{"id":1,"name":"Ada"}]. Nested objects or arrays inside a row are not flattened; they are written into one cell as JSON text.
- What happens if rows have different fields?
- The header row is the union of every key seen across all rows; any row missing a field gets a blank cell for it.
- Can I choose a different delimiter?
- Yes — comma, semicolon and tab are supported, which covers the common regional spreadsheet conventions.