JSON to CSV and CSV to JSON converter
Input
emptyCSV
Why your ids survive here
CSV has no types. Every cell is text, so a converter has to decide what 007 means. Answer "the number 7" and ZIP codes, phone numbers and order ids quietly lose their leading zeros. Long ids fare worse: read 9007199254740993 as a number and it comes back as 9007199254740992, because it does not fit in a double.
This page retypes a cell only when doing so is reversible. 30 becomes the number 30, because writing 30 back gives you 30. 007 stays text, because writing 7 back does not give you 007. Same for 1.0, which stays text rather than becoming 1.
Nested objects become columns, arrays stay in one cell
An address holding a city becomes an address.city column, and converting back rebuilds the nesting. An array stays in a single cell as JSON. The alternative is a column per element, which turns one record with a 50-item array into 50 columns that every other row leaves empty.
Which output to pick
CSV (comma) is the standard, and what you want for anything that will be read by code. CSV for Excel (semicolon) adds a byte order mark and uses semicolons, which is what stops Excel showing Grüße as mojibake and what makes it split columns in a European locale. TSV (tab) is for pasting straight into a spreadsheet or a terminal.
Converting back asks you none of this. The delimiter and the byte order mark are read from the file, the same way the base64 page works out which alphabet you pasted.
Empty cells, and the two things that are not symmetrical
A JSON null is written as an empty cell, and an empty string is written as an empty pair of quotes, so the two stay apart through a round trip. A CSV from somewhere else with a blank cell therefore reads as null.
CSV to JSON always gives you an array, even for one row. So a single object converted to CSV and back comes out as an array holding that object. That is better than guessing from the row count.
The other one is CSV's rather than ours. A table is rectangular: every row carries every column. So a record that is missing a key and a record with an explicit null both become an empty cell, and nothing can tell them apart on the way back. If your records do not all have the same keys, the page says so, and the JSON you get back has those keys filled in as null.