Convert a JSON array of objects into CSV. The header is the union of every key, gaps become empty cells, and quotes and newlines are escaped correctly.
Waiting for input
Paste a JSON array of objects. Everything runs in your browser.
Paste a JSON array to convert
One object per row, one key per column — ready for a spreadsheet.
JSON to CSV runs entirely on your device — nothing is uploaded.
You’re on the Free plan. Compare plans
CSV is a table: a fixed set of columns, one row per record. JSON is a tree. The conversion only makes sense when the JSON already looks like a table — an array of objects — so that is what this tool accepts, and anything else is refused with an explanation rather than converted into something misleading.
The header is the union of every object's keys, in the order they are first seen. If one row has a key the others lack, that column still appears and the other rows get an empty cell. No row is dropped and no key is dropped.
Nested values are the honest hard case. A value that is itself an object or an array is written as its compact JSON inside the cell, correctly escaped — {"city":"London"} becomes "{""city"":""London""}". This is deliberate: inventing a flattening convention such as address.city would rename your fields to something no other tool agrees on, and a convention nobody shares is worse than a value you can parse.
Escaping follows RFC 4180. A value containing a comma, a quote or a line break is wrapped in quotes, and embedded quotes are doubled, so a name like Smith, John survives the round trip into a spreadsheet intact.
CSV needs rows, and one object is one row with no way to know whether you intended a table at all. Wrapping it in square brackets — turning { … } into [ { … } ] — converts it as a single row. The tool suggests exactly this when it sees a bare object.
The header becomes the union of every key, in first-seen order. Given [{"name":"Alice","age":25},{"name":"Bob","city":"London"}] the header is name,age,city, and each row gets an empty cell where it has no value. The status bar reports how many cells were filled this way so the gaps are never a surprise.
They are written as compact JSON inside the cell and escaped according to CSV rules. The tool does not flatten them into dotted column names, because that would silently rename your fields to a convention no other tool follows. If you need flattened columns, reshape the JSON before converting it.
Yes. Escaping follows RFC 4180: any value containing the separator, a double quote, or a line break is wrapped in quotes, and embedded quotes are doubled. A value such as Smith, John or He said "hello" converts and re-imports without corruption.
A null becomes an empty cell, which is the closest CSV equivalent — CSV has no way to distinguish an empty string from a missing value. This means the conversion is not perfectly reversible for documents containing nulls, and converting back gives you an empty string.