How to convert JSON to CSV without losing your nested data
The shape converters trip over is nesting: JSON is a tree, CSV is a flat table. Paste an array of objects above and each object becomes a row, while nested fields flatten into dot-notation columns - so { "contact": { "city": "London" } } turns into a contact.city column. Rows don't need matching keys: the converter takes the union of every column it sees, in first-seen order, and leaves missing cells blank. Arrays inside a value are embedded as JSON strings rather than exploded into extra rows, so one input record is always exactly one CSV row - no silently multiplied data. Conversion runs entirely in your browser; nothing you paste is uploaded anywhere.
Fields that contain commas, quotes, or line breaks are quoted and escaped to the CSV standard (RFC 4180), so the file opens correctly in Google Sheets, Excel, Numbers, and pandas. If Excel shows garbled characters for accents or emoji, that's a known Excel quirk with plain UTF-8 - the Pro "Excel-compatible" option prepends a UTF-8 byte-order mark and switches to CRLF line endings, which makes Excel render everything correctly on double-click.
A few practical tips. If your data is a log export with one JSON object per line (NDJSON / JSON Lines), it isn't valid JSON as a whole - the converter detects this and the JSON Lines option parses it line by line. A single object (not an array) converts as one row, which is handy for quickly tabulating an API response. And numbers like 007keep their leading zeros when converting CSV back to JSON, because they stay strings unless they're unambiguously numeric.
Working with API data often pairs with two sibling tools: once your JSON is tabulated, generate a validated TypeScript schema for the same payload with the JSON to Zod schema converter, and if the data comes from a scheduled export job, double-check the schedule with the cron expression generator. Need the sheet shared with a campaign team? Tag the link first with the UTM builder.
Last updated July 2026.