Paste CSV text or drag in a .csv / .xlsx file; the delimiter is found for you, the header row becomes your keys, and out comes clean JSON. The semicolons European Excel writes and the leading zero on a phone number both survive. Your file never leaves the browser.
Drag your .csv or .xlsx file here, or
text number boolean / date null
Paste your CSV into the box, or drag a .csv or .xlsx file onto it. The file is read in your browser and is never uploaded.
Comma, semicolon, tab and pipe are all tried and the most consistent one wins, so the semicolon European Excel writes is found for you. Pick the delimiter yourself if the guess is wrong, and clear the box when the first row is not a header.
Numbers, booleans and null are inferred by default. Digit strings such as phone numbers, national ID numbers and barcodes are left as text, and the preview colours every cell by the type it will carry in the output.
Choose an array of objects, an array of arrays, or output keyed or grouped by one column. Copy it indented or on a single line, or download it as a .json file.
Where the decimal mark is a comma -- Turkish, German, French, Spanish, Italian and most of Europe -- the file Excel saves as “CSV (comma delimited)” actually holds semicolons. Hand that file to a converter that assumes commas and every row becomes a single column, leaving you with JSON objects that have one key each.
This tool does not guess the delimiter, it tries it: the start of the file is genuinely parsed with each of the four candidates, and the one whose rows agree most closely on a column count wins. Delimiters inside quotes are not counted, so a cell like “Kaya, Deniz” cannot make a comma look like a separator. If the answer is wrong, pick the delimiter yourself with the buttons above.
| Delimiter | Where does it come from? | What to watch for |
|---|---|---|
; |
Turkish, German and French Excel; any locale whose decimal mark is a comma. | The numbers arrive with commas too: 42500,50 is not a valid JSON number and stays text. |
, |
RFC 4180, English Excel, most APIs and database exports. | Commas inside text have to be protected with quotes; if they are not, the column count changes from row to row. |
| Tab | TSV files, copy and paste out of a database client, a selection copied from a spreadsheet. | A tab character is invisible once pasted into a text box, so choosing the delimiter by hand is safest. |
| |
Legacy batch files, log exports, some bank and e-invoice formats. | Quoting is usually absent, so a pipe inside a field shifts the whole row. |
CSV has no types; every cell is text. This is the one place a converter can quietly ruin your data. Turn a phone number with a leading zero into a number and the zero is gone; turn a nineteen-digit order number into one and its last digits change, and you only find out once you start using the data.
Here a value becomes a number only if it passes two tests. First it has to match JSON's own number grammar, which on its own rules out leading zeros. Then converting it and writing it back has to produce the same decimal, which rules out long identifiers and anything that would lose precision. The whole column is examined as well: a column of digit runs that looks like an identifier is kept as text in full, so one row cannot be a number while its neighbour is a string.
| Text in the cell | JSON output | Why? |
|---|---|---|
00123 |
"00123" |
A digit string with a leading zero is not a JSON number, and converting it would break a postcode or a product code. |
05321234567 |
"05321234567" |
A phone number is an identifier, not a quantity, and its leading zero means something. |
12345678901 |
"12345678901" |
The whole column is eleven-digit digit strings, so it is treated as an identifier. Switch the identifier guard off and it becomes a number. |
12345678901234567890 |
"12345678901234567890" |
This value does not fit in a double; converting it would change its last digits. |
42500.50 |
42500.5 |
The value is the same, only its spelling got shorter. JSON numbers cannot keep a trailing zero. |
42500,50 |
"42500,50" |
A comma decimal is not a JSON number. If you want that column as numbers, export the file with a point instead. |
true / false |
true / false |
Only these two words become booleans. Localised spellings -- Excel's Turkish DOĞRU and YANLIŞ, German WAHR and FALSCH -- stay text, because they are ordinary words that turn up as data. |
| empty cell | null |
You choose whether an empty cell becomes null; with the option off it is written as an empty string. |
The same table is useful in different shapes depending on the code that will read it. An array of objects to loop over a list, a keyed object to look a record up by its id, a grouped object when you want sub-lists by one field.
| Format | Output | When? |
|---|---|---|
| Array of objects | [{"name": "Alice", "city": "London"}] |
The default. Request bodies, test data, seed files; the header row becomes the keys. |
| Array of arrays | [["name", "city"], ["Alice", "London"]] |
For moving the table as it stands. The header row is written as the first array, no key is repeated, and the file is smaller. |
| Keyed object | {"7": {"name": "Alice"}} |
For looking a record up by its id. The value of the column you pick becomes the key; on a repeat the last row wins and you are told how many there were. |
| Grouped | {"London": [{"name": "Alice"}]} |
For sub-lists by a field such as city, department or status. Rows sharing a value are collected into one array. |
Comma, semicolon, tab and pipe are all tried, and the one whose rows agree most closely on a column count wins. When it cannot be sure, it says so.
A delimiter, a line break and a doubled-quote escape inside quotes are all preserved. CRLF line endings and a UTF-8 byte order mark are handled without a word.
Leading zeros, digit strings of national-identity-number length and anything too long for a double all stay text. You are told which column was protected and why.
Drop an .xlsx and pick the sheet. Excel's own cell types are used: a code stored as text is never turned into a number, and dates are written as ISO 8601.
The preview table colours every cell by the type it will have in the output. Number, text, boolean and null are one glance apart.
Reading, converting and downloading all happen inside the browser. A customer list or an HR file reaches no server.
If you have JSON and want a table, the sibling tool flattens nested fields into columns and writes .xlsx or .csv with the semicolon and UTF-8 BOM options European Excel expects.
Flatten nested JSON into columns and download it as .xlsx or .csv.
Yes, with nothing to configure. Where the decimal mark is a comma -- Turkish, German, French, Spanish and most of Europe -- Excel writes semicolons into the file it calls "CSV (comma delimited)". The tool actually parses the start of the file with all four candidates and keeps the one that gives the most consistent column count, ignoring delimiters inside quotes. You can also pick the delimiter by hand.
Yes. A value becomes a number only if it matches JSON's own number grammar and converting it to a double and back lands on the same decimal. Those two tests rule out leading zeros and any digit string too long for a double. The tool also looks at the whole column: a column of digit runs that looks like an identifier is kept as text in full, so one row cannot come out as a number while its neighbour comes out as a string.
Yes, drop the .xlsx straight onto the page; if the workbook has more than one sheet you get a list to pick from. Excel's own cell types are used: a code stored as text is never turned into a number, and dates are written as ISO 8601 text. The file is still opened inside your browser and never reaches a server.
Yes. A delimiter, a line break and a doubled quote ("") inside a quoted field are all preserved exactly; CRLF line endings and a UTF-8 byte order mark are handled without a word. Where the format is genuinely ambiguous the parser was written to give the same answer as Python's csv module.
Four: an array of objects (the default, with the header row as keys), an array of arrays, an object keyed by a column you choose, and an object grouping rows by that same column. You can copy the result pretty-printed or minified, or download it as a .json file.
No. Reading, delimiter detection, type inference and the download all happen inside your browser, and no request carrying your data is made after the page loads. That makes it safe for customer lists, HR files or database exports you cannot share.