What this tool does
An array of objects becomes rows; the keys become the header.
[
{ "name": "Ada", "born": 1815 },
{ "name": "Alan", "born": 1912 }
]
name,born
Ada,1815
Alan,1912
The root has to be an array of objects: a table is a list of records, and a single object has no rows. Wrap it in [ ] if you meant one row.
Long identifiers keep their digits
[{ "id": 12345678901234567890 }]
comes out with all twenty digits. Converters that parse JSON into a JavaScript value first round anything past about fifteen — silently, and into a number that no longer matches the row it came from.
Three ambiguities, named
Null and empty string are the same cell. null and "" both produce nothing between the delimiters, and no reader can tell them apart afterwards. If the difference matters, CSV is the wrong destination.
A nested value becomes JSON in the cell. A cell holds one value; your key holds a subtree. Spreading it over invented parent.child columns would impose a naming convention your consumer never agreed to.
Ragged records become a union. The header is every key seen, in first-seen order; a record missing one gets an empty cell. Dropping the column, or the row, would lose data for the sake of a tidy rectangle.
The Excel option
Excel does not read plain UTF-8 CSV reliably: it guesses the encoding from the bytes and usually guesses your system’s legacy code page, which is how café becomes café.
The Excel setting writes two things Excel understands: a byte-order mark, and a leading sep=, line that names the delimiter. Neither is standard CSV — sep= in particular is a Microsoft extension that other readers will show as a first row of data — which is why it is a setting you turn on, not the default.
Private by design
Everything runs locally in your browser with JavaScript. Your data is never uploaded, which makes the tool safe for sensitive content, and it keeps working offline.