data tool

JSON to table

Paste JSON or open a .json file and an array of objects becomes a table: one row per object, one column per key, with nested objects opened into columns named by dot path such as address.city. Sort by any column, filter the rows, and download the table as a CSV that opens in any spreadsheet.

Loading the tool…

How it works

  1. 1

    Paste or open the JSON

    Paste into the box, open a .json file, or drop one onto the panel. Try form webhook payloads loads three sample submissions in the shape a form webhook sends.

  2. 2

    Check where the rows come from

    Rows from lists every array the tool found, largest array of objects first, so a response wrapped as {"data": [...]} opens on its list straight away.

  3. 3

    Sort and filter

    Press a column heading to sort by it and press again to reverse. Type in Filter rows to keep only rows that contain that text in any column.

  4. 4

    Download the CSV

    Download CSV saves the rows in the order and filter on screen, with a header row of dot path names. Copy as CSV puts the same text on the clipboard.

How nested JSON becomes columns

A table has one level of columns and JSON can nest as deep as it likes, so something has to give. Here each nested object is opened into its keys and the column is named by the path to the value: an object holding {"address": {"city": "Sydney", "postcode": "2000"}} gives two columns, address.city and address.postcode. Columns appear in the order keys are first met, so the first object sets the layout and any key that only shows up later is added to the right. A row that lacks a key gets an empty cell, which is different from a JSON null: the table writes null in grey so the two can be told apart, and the CSV leaves both empty, which is what a spreadsheet expects.

Why arrays stay as text

An array inside a row has no single place to go. Spreading it over numbered columns, days.0, days.1, days.2, makes a table that changes width from row to row and is hard to read, and joining it with commas hides values that contain commas. So an array inside an object stays whole and is shown as its JSON, ["Mon","Wed"]. The same rule covers a top level array of arrays, such as [[1, 2], [3, 4]]: only arrays of objects become rows with named columns, so each inner array is one row of text in a column called value, and a note says so. If those inner arrays are really rows of a spreadsheet, the CSV to JSON converter is the better tool for that shape.

Reading a form webhook payload

A form with the webhook add on sends one POST with a JSON body for each submission, once, with no retry. The body has an event name, a timestamp, the form's id, title and slug, and a response with its id, the answers keyed by field label under data, and the same answers keyed by field id under raw_data. Collect a few of those payloads into an array and this tool lays them out as a table with columns such as response.data.Email and form.title, which is the quickest way to check that every field arrives and is named the way the receiving system expects before it goes live.

Limits worth knowing

Parsing happens in the page, so the practical ceiling is memory: files over 50 MB are refused with a message rather than left to freeze the tab. Invalid JSON is not guessed at; the line and column of the first fault are shown with a hint, so a trailing comma or a single quote can be fixed at the source. Very large numbers, beyond about sixteen digits, are rounded by the browser the moment they are read, so an id held as a long number may come out changed; ask for ids as strings where that matters. Nothing is uploaded and nothing is stored, ever, so a refresh clears the table.

Limits

  • Only arrays of objects become rows with columns. An array of arrays is shown as JSON text in a single column, and an array inside a row stays whole as text.
  • Files over 50 MB are refused with a message, because a browser tab parsing that much text can run out of memory.
  • The table shows 200 rows a page; the CSV always carries every row that matches the filter.

What it does not do

  • It does not read JSON Lines, where each line is its own object. Wrap the lines in [ ] with commas between them first.
  • It does not edit values or turn the table back into JSON.
  • It does not fetch JSON from a web address. Paste it or open the file.

Questions people ask

How do I open a JSON file in Excel as a table?

Excel can import JSON through Get Data, From File, From JSON, then a few Power Query steps to expand each record. A quicker route for a one off look is to open the file here, check the columns, press Download CSV, and open that CSV in Excel, Numbers or Google Sheets. Nested keys arrive as dot path column headings.

My JSON is an object with a list inside it. Which part becomes the table?

The tool searches the object for arrays and offers each one under Rows from, with the largest array of objects chosen first. API responses that wrap results as data, items or results therefore open on the list itself. Pick another array from the menu, or choose the whole object as one row, if the first guess is not the part you wanted.

What happens to keys that only some objects have?

Every key found in any object becomes a column, in the order it first appears. Objects without that key get an empty cell, so a sparse dataset gives a wide table with gaps rather than an error. Sort by the column and the empty cells go to the bottom, which is a fast way to find the records missing a value.

Can I turn the table back into JSON?

Not here; this tool only reads JSON. Download the CSV, edit it in a spreadsheet, and then use the CSV to JSON converter, which rebuilds nested objects from dot path headings such as address.city. Arrays that were shown as text come back as text in that round trip, so check those columns before you rely on the result.

Why do some numbers look different from the file?

A browser stores every JSON number as a double precision float, which holds about sixteen significant digits. A longer number, such as an eighteen digit order id, is rounded as soon as it is parsed, and the table shows the rounded value. The fix belongs at the source: send such ids as strings, which keep every digit exactly.

Is the JSON I paste sent anywhere?

No. The text is parsed by the browser inside this page and no network request carries it, which you can confirm in the network tab of the developer tools. Nothing is written to storage either, so webhook payloads with names, emails or addresses leave no copy behind once you close or refresh the tab.

Build a form that sends this JSON

Take what you made here into forms.

Create a form with OneCraft

More tools like this

Background reading: the question page on this.

Sources

Written and checked by the OneCraft team. Last checked .