BeltConvert

JSON to Excel Converter

Paste JSON or drop a .json file and download an .xlsx workbook with one row per record.

How to use

  1. Step 1Paste the JSON or drop a .json file. An array of objects works best; if the records sit inside an envelope such as {"data": [...]}, the converter finds the array and lists it under "Rows come from".
  2. Step 2Check the settings: the sheet name, whether lists of values are joined in one cell or spread over columns, and whether strings that look like ISO dates should become real Excel dates.
  3. Step 3Download data.xlsx and open it in Excel, Google Sheets (File › Import) or Numbers. The first row holds the column names and stays frozen while you scroll.

Where JSON files come from and what shape they have

JSON (RFC 8259) is the text format most web APIs answer in and most apps export: order lists from Shopify or Stripe, issues from GitHub or Jira, contacts from a CRM, a Firebase or Notion export, the response you copied from the Network tab of the browser, a file written by a Python script. Whoever produced it, the records almost always come as an array of objects, one object per record, and that array is what becomes the rows of the sheet.

Often the array is wrapped in an envelope object that also carries paging or status fields: {"ok": true, "page": 2, "data": [...]} or {"results": {"items": [...]}}. The converter looks through the object, lists every array it finds with the number of items, and starts with the largest list of objects. "Rows come from" lets you pick another one, or the whole object as a single row.

Two more shapes are read without any preparation: a single object, which becomes one row with a column per field, and JSON Lines (.jsonl, .ndjson), one JSON value per line, which is what mongoexport, log tools and many bulk APIs write. The converter notices that the text is not one document but every line is, and treats the lines as the array.

How nested data becomes rows and columns

A spreadsheet is flat, JSON is not, so every value gets a column named by its path. The record below is one order; the table shows the columns it produces and where each comes from.

  • The columns are the union of every path seen in any record, in the order they first appear. A record without a field simply gets an empty cell there, so records with different keys land in one table.
  • Arrays of objects are always spread over indexed columns, and the record with the most items decides how many item columns the sheet has; an order with three items adds items[2].sku for everyone.
  • Arrays of plain values are joined in one cell by default because that keeps the table narrow; switch to one column per item when you need to filter or count them.
  • A document whose records are arrays rather than objects (a matrix such as [[1, 2], [3, 4]]) gets positional columns named 1, 2, 3.
ColumnValueComes from
id1001a plain field
customer.nameAda Lovelacea field of the nested customer object
items[0].skuLAMP-01the first object of the items array
items[1].qty2the second object of the items array
tagsgift; expressan array of plain values, joined with "; "
tags[0], tags[1]gift, expressthe same array with "one column per item" chosen
note(empty)null, a missing key or an empty array

What the Excel file keeps and what it cannot

The result is an .xlsx workbook (Office Open XML, ECMA-376) with one sheet, a bold header row and column widths taken from the content. Cell types follow the JSON types: numbers are written as numbers, true and false as Excel booleans (shown as TRUE and FALSE), null as an empty cell and strings as text. A string such as "00123" therefore keeps its leading zeros, which is not what happens when Excel opens a CSV and guesses.

Strings in ISO 8601 form (2026-03-04, 2026-03-04T13:45:00Z, 2026-03-04 13:45) become real Excel dates when the option is on, so they sort and subtract correctly. The calendar date and clock time are written as they appear in the JSON; a time zone suffix is dropped because Excel has no zones. Turn the option off if you want the strings kept literally.

  • A cell holds at most 32,767 characters. Longer text is cut and the page says how many cells were affected.
  • A sheet holds 1,048,576 rows and 16,384 columns; anything beyond is left out with a warning.
  • Excel keeps 15 significant digits, and JavaScript, which this page runs on, reads a bare JSON number as a double, so identifiers longer than 15 digits should be strings in the JSON ("id": "1234567890123456789").
  • The nesting itself is gone: the paths in the header are the only record of it. Nothing else is lost, and the same JSON always produces the same columns in the same order.

Practical notes

  • One sheet per array: the converter writes one sheet per file on purpose, because each array needs its own set of columns. Convert once per array by changing "Rows come from", then in Excel right-click a sheet tab and use Move or Copy to gather them into one workbook.
  • Excel's own Get Data › From JSON (Power Query) reads JSON too, but you expand records and lists column by column and it is not available in Google Sheets; this page does the flattening in one step.
  • Dates you did not expect: any string that is exactly a calendar date is converted, so a batch code written as 2026-03-04 becomes a date as well. Turn the option off for such data.
  • Large files: everything runs in your browser's memory. A few hundred thousand rows are fine, but the text box is the slow part, so drop the file instead of pasting it.

Questions and answers

My JSON is an object, not an array. What happens?

If the object contains arrays, the largest array of objects becomes the rows and every other array is offered under "Rows come from", with its size. If you want the object itself as a single row with one column per field, choose "The whole object, as one row".

Why are some columns empty?

The columns are the union of every key found in any record. A record that lacks a key gets an empty cell in that column, and a null value or an empty array shows the same way. Look at the header path: an empty items[2].sku means only some orders had a third item.

How do I get one sheet per array?

Convert once per array, choosing a different entry under "Rows come from" each time, and download each file. In Excel, right-click a sheet tab, choose Move or Copy and pick the other workbook to bring the sheets together.

Why did "00123" stay text while 123 became a number?

JSON carries the type: "00123" in quotes is a string, 123 without quotes a number, and the converter writes each as that type. Strings keep their zeros and never turn into dates or numbers, which is the main difference from opening a CSV in Excel.

Is the file compatible with Google Sheets, Numbers and LibreOffice?

Yes. The workbook is standard Office Open XML, the format Excel has used since 2007. Google Sheets imports it through File › Import, Numbers and LibreOffice Calc open it directly; frozen header, bold header cells and column widths are kept by all of them.