Paste your JSON, let us open nested fields into columns, and download it as .xlsx or .csv. With semicolon and UTF-8 BOM options for Turkish Excel. Your file never leaves your browser.
Drop a file here or
A comma decimal mark cannot be used while the delimiter is a comma.
Untick a column you do not want, and use the arrows to change its position.
Paste the data into the box or drop a .json file onto it. An array of objects, a single object, an array arriving inside a wrapper, and JSON Lines with one object per line are all recognised.
Objects become columns with dot notation. For arrays, pick one of joining with commas, expanding into rows, one column per item, or leaving them as JSON text.
Untick a column you do not want and use the arrows to reorder it. The preview shows numbers, dates and booleans in separate colours, so you see the types before downloading.
The Excel file carries the types and the formula protection. If you choose CSV, leave the delimiter as a semicolon and the UTF-8 BOM on for Turkish Excel. The file is built in your browser.
JSON is a tree: a field can hold another object, and that one an array. Excel is a flat rectangle. What we call conversion is really deciding what to do everywhere the two disagree.
Nested objects are opened up with dot notation: a city inside an address field becomes a column named address.city. The same rule applies at any depth, and the field's full path becomes the column name. Some systems want an underscore instead of a dot, and you can pick that too.
| JSON structure | What it becomes in the table |
|---|---|
{"adres": {"sehir": "İzmir"}} | A single column named address.city |
{"etiket": ["a", "b"]} | Depending on your choice: “a, b” in one cell, or columns tag.1 and tag.2 |
{"kalem": [{"ad": "x"}, {"ad": "y"}]} | Two rows if row expansion is selected; the other fields repeat on both |
{"status": "ok", "data": [...]} | The table is taken from the data array, and the wrapping fields are skipped |
[{"a": 1}, {"b": 2}] | Columns a and b; missing fields stay as empty cells |
Column order is the order the fields first appear in the file. If the records do not all carry the same fields, the columns come from their union: a field present in one record and absent from another still stands as a column, and its cell is left empty on that row. An empty cell is genuinely empty, not a zero or the text “null”.
CSV files have two classic problems in Turkey, and both come from how Excel reads the file rather than from the file itself.
The first is the delimiter. Excel decides how fields are separated by looking at the list separator in the Windows regional settings, not at the file. On a Turkish install that separator is a semicolon, because the decimal mark is a comma and the two cannot be the same. Double-click a classic comma-separated CSV on such a machine and the whole row piles into one cell. That is why the default delimiter here is a semicolon.
The second is the encoding. Unless told otherwise, Excel assumes a UTF-8 file is Windows-1254; multi-byte Turkish letters get split in two and you see “çaÄŸrı” instead of “Çağrı”. The fix is to put an invisible three-byte marker called a UTF-8 BOM at the start of the file, which Excel recognises and then reads correctly. The BOM option here is on by default.
Both problems belong to CSV alone. An .xlsx file carries its encoding and its field boundaries internally, so it has neither a delimiter nor a BOM problem. Unless you have to feed the data to another program, choosing .xlsx is always safer.
| Symptom | Cause | Fix |
|---|---|---|
| All the data is in one column | The delimiter in the file differs from the one Excel expects | Choose the semicolon delimiter |
| The letters ğ, ş, ı and ç look broken | Excel thinks the file is Windows-1254 rather than UTF-8 | Leave the UTF-8 BOM option on |
| Decimal numbers look like text | Excel expects a comma decimal mark and the file has a dot | Tick the comma decimal mark option, or download .xlsx |
| Long ID numbers turned into 1.23457E+19 | Excel converts numbers longer than 15 digits to scientific notation | This tool already writes very large numbers as text |
If a cell's content starts with an equals sign, Excel treats it as a formula rather than data. The same goes for plus, minus and the at sign. That is the behaviour we want when typing by hand; in a file that came from outside, it is an attack surface.
The scenario runs like this: a user types a formula into a field meant for their name. That record lands in a database, months later somebody exports the report and opens the file. The formula runs on the machine of whoever opened it, with their privileges. Spreadsheet formulas can read other cells and leak data to outside addresses; in some configurations they go as far as running programs. This weakness is called CSV injection, and it has to be closed on the side that produces the file, because the harm falls on the side that opens it.
This tool is protected by default, and takes two different routes for the two formats. In the Excel file the cell is already written as text, and Excel's own “this is text” flag is set on top of it; the value stands exactly as it was, not one character altered, but it is never calculated. CSV has no such flag, because CSV has no notion of type, so there a single quote is added in front of the value. The single quote is invisible in Excel and visible in a plain text editor. You can switch the protection off, but you should not if anyone other than you will open the file.
| The value inside the JSON | If opened unprotected | In this tool |
|---|---|---|
=1+1 | The cell shows 2 and the real value is lost | The text =1+1 appears exactly as it is |
@SUM(A1:A9) | Turns into a formula and is calculated | Stays text |
-5 | Converted to a number, and leading information may be lost | Text stays text and a number stays a number, as in the JSON |
=HYPERLINK("http://...") | Turns into a clickable link | Stays harmless text |
The most damaging habit a spreadsheet has is guessing what the data is. A code written into a text column becomes a date, a long ID number becomes scientific notation, and there is no way back. In science this got so bad that geneticists had to rename the genes their spreadsheets kept mangling.
This tool tries not to guess. A number in the JSON is written as a number, a true or false as a boolean, an absent value as an empty cell; the type is already in the source, so there is nothing to invent.
For dates the measure is this: only a full ISO 8601 format counts as a date, meaning values written as 2026-09-03 or 2026-09-03T14:30:00. Text that resembles a date but might not be one, such as “3-4” or “01/02/03”, is left as text. You can switch this behaviour off entirely, in which case every date is written as text.
With large numbers, this happens: JavaScript cannot hold integers longer than about 16 digits exactly. An order number, a Twitter ID or a 20-digit reference above that limit gets rounded. This tool writes such a number as text, digit for digit as the file had it, and tells you so. Handing you text is more honest than handing you a rounded number.
Turns every field into a column with dot notation, however deep it goes. For arrays you pick one of four behaviours.
Values starting with an equals, plus, minus or at sign are written so they cannot run, with their content completely unchanged.
The semicolon delimiter and the UTF-8 BOM are on by default, so the file looks right when you double-click it.
A number stays a number, a boolean stays a boolean, and an ISO date becomes a real date cell. Nothing that should be text is turned into a date.
You tick which columns go into the file and reorder them with the arrows. The preview shows the result immediately.
Reading, converting and writing the file all happen inside your browser. A customer list or employee record is not uploaded anywhere.
No. Reading, converting and writing the file all happen inside your browser. The data you paste or drop is never sent anywhere and never stored. You can safely use it with customer lists, employee records or API output that should not leave your machine.
Nested fields are flattened with dot notation. For example {"address": {"city": "Izmir"}} becomes a column named address.city. The same rule applies at any depth, and the field's full path becomes the column name. You can use an underscore or a slash instead of a dot, since some systems reject column names containing dots.
You pick one of four behaviours. Join with commas writes the array's values into a single cell. Expand object arrays into rows produces one row per item and repeats the record's other fields on each row, which is the right choice for things like order line items. One column per item creates numbered columns such as tags.1 and tags.2. Leave as JSON text writes the array into the cell as it stands.
This only affects CSV. Unless told otherwise, Excel assumes the file is Windows-1254 rather than UTF-8, so multi-byte Turkish letters get split in two and you see mojibake instead of the right characters. The fix is a UTF-8 BOM, an invisible three-byte marker at the start of the file, which this tool adds by default. The other way round it is to download .xlsx instead: an Excel file carries its encoding internally and never has this problem.
A delimiter mismatch. Excel decides how fields are separated by looking at the list separator in Windows regional settings, not at the file. On a Turkish install that separator is a semicolon, because the decimal mark is a comma and the two cannot be the same. Double-clicking a comma-separated CSV on such a machine drops the whole row into one cell. This tool defaults to a semicolon; switch to a comma if you are feeding the data to something other than Excel.
Excel treats a cell starting with an equals, plus, minus or at sign as a formula rather than data. With data that came from outside, that is a security hole: if a user types a formula into a name field, the formula runs on the machine of whoever opens the report, with their privileges. This is known as CSV injection. The tool guards against it by default. In the Excel file the cell is written as text and carries Excel's own "this is text" flag, so the value is displayed unchanged but never evaluated. CSV has no notion of type, so there the value is prefixed with a single quote.
JavaScript cannot hold integers longer than about 16 digits exactly, so a 20-digit order number or platform ID read as a number would have its last digits altered. This tool writes such a value as text, digit for digit as the file had it, and tells you so in the preview. Handing you intact text is more honest than handing you a rounded number. Excel also converts anything longer than 15 digits to scientific notation, so writing it as text is what keeps the number readable.
Only full ISO 8601 values. Something written as 2026-09-03 or 2026-09-03T14:30:00 becomes a real date cell that Excel can sort and format as a date. Text that merely looks like a date, such as 3-4 or 01/02/03, is left as text. That is deliberate: spreadsheets guessing at dates is exactly what has permanently mangled product codes and gene names for years. You can turn date detection off entirely if you prefer.
Yes. A single object at the root produces a one-row table. If the JSON is wrapped, as in {"status": "ok", "data": [...]}, the tool finds the longest array of objects inside and builds the table from it, telling you in the preview which field it used. JSON Lines, where each line is its own JSON object, is also recognised and read line by line, which is the shape most log output and database exports come in.
The practical limit is your browser's memory. Ten thousand rows are ready in seconds and produce an .xlsx of roughly 240 KB. A hundred thousand rows also work, though the file takes a few seconds to build, and the tool warns you once the table passes twenty thousand rows. Excel's own limits apply too: a sheet holds at most 1,048,576 rows and 16,384 columns, and a single cell at most 32,767 characters. Where those limits are exceeded the tool truncates and tells you afterwards how many rows or cells were affected.
Yes. Once the conversion runs, every column appears in a list. Untick the ones you do not want, reorder them with the arrows, and the preview and row count update immediately. Your choices survive a change of input: a column you switched off stays off if it is still present in the new data.
The columns are the union of every record. A field that appears in only one record still becomes a column, and the rows without it are left blank. A blank cell is genuinely empty, not a zero or the text "null", so sorting and filtering behave correctly in Excel. Column order follows the order the fields first appear in the file.