How to Use This Tool
Paste JSON and get CSV. The choices that matter are exposed rather than made silently, because they change what you can do with the result.
Nested objects become dotted columns
{"user": {"name": "Ada"}} becomes a column called user.name. This part is
lossless and reversible — the dots record exactly where the value came from, so the structure can
be rebuilt later if needed. Depth does not matter; a.b.c.d works the same way.
Arrays are the real decision
There is no lossless way to put a list in a flat cell, so you are choosing which problem to have:
- Joined into one cell —
admin|dev. The table keeps a stable shape no matter how many items each row has. The cost is that the list becomes a string, so a spreadsheet cannot filter on one item without splitting it again. Pick a separator that cannot appear in your data. - Numbered columns —
tags.0,tags.1. Each item stays addressable. The cost is that the table widens to fit the longest row, most cells end up empty, and adding one item with more entries changes the header. Fine when array lengths are fixed and known; fragile otherwise.
Missing keys, and why the header is a union
Real API responses do not have identical keys in every object. The header here is the union of every key that appears anywhere, and a row that lacks one gets an empty cell in that position.
The alternative — writing each row's own keys in order — produces a file where values land under the wrong headers, which is the most damaging CSV bug there is because it looks fine until someone reads the wrong column and believes it.
The Excel option
The Excel-safe checkbox adds a byte order mark to the front of the file. Without it, Excel opens a UTF-8 CSV as if it were the local legacy encoding, and any non-English text arrives as mojibake. The mark is invisible in every other tool and costs three bytes, so leaving it on is usually right. Turn it off if the file is going to a parser that treats the mark as part of the first column name — some do.
What CSV cannot carry
Types. Everything in a CSV is text, so true, 1 and "1" all
arrive identically and whatever reads the file guesses again. Leading zeros in identifiers are
particularly prone to being eaten by spreadsheets. If types matter for what happens next, CSV is the
wrong destination and JSON Lines or Parquet will serve better.
