API, Data & Developer Tools

JSON Table Explorer

Open large JSON locally, pick the array to tabulate, flatten nested paths into columns, filter and sort, and export exactly the columns you chose to CSV or JSON.

  • Tree and table views
  • Filtered CSV/JSON export
Runs in your browser

Everything you paste, type or drop is processed in this browser tab. It is not uploaded, logged, stored or sent to analytics.

JSON explorer workspace

1 Your JSON

Examples:

Drop a .json or .jsonl file

Up to 50 MB, 64 levels deep and 200,000 rows. Read in this browser only.

Flattening options
Nested arrays inside a row

Expanding is capped at 50 items per array so a long list cannot create thousands of columns.

2 Table

Load an example, drop a file or paste JSON, then choose Explore.

What the JSON Table Explorer does

This explorer turns a JSON document into a table you can read: it finds every array in the file, lets you pick the one that holds your records, flattens nested objects into dotted columns such as customer.name, and then lets you filter, sort, choose columns and export exactly that selection as CSV or JSON.

It is built for the awkward middle ground between a pretty-printer and a database - an API response you need to eyeball, a log exported as JSON Lines, a GeoJSON file with a few hundred features. The file is parsed in your browser and never uploaded, with limits of 50 MB, 64 levels of nesting and 200,000 rows so a large or hostile file fails with a message rather than freezing the tab.

How to use it

  1. Drop a .json, .jsonl or .geojson file, paste the text, or load one of the examples, then choose Explore. Plain JSON is tried first; if that fails and there are several lines, each line is read as its own JSON Lines record.
  2. Pick the array to tabulate. The list shows every array found, with arrays of objects first - for a typical API response that is something like $.data or $.results, not the pagination block.
  3. Choose columns. Up to 30 are ticked at first; open the column list to add or remove others. Nested objects appear as dotted paths, and arrays inside a row are kept as JSON text unless you switch them to indexed columns (items.0.sku, items.1.sku).
  4. Filter and sort. Filters are simple conditions on one column or on any column - contains, equals, greater or less than, empty or not - so nothing you type is ever run as code.
  5. Download CSV or JSON. Both contain only the rows that pass your filter and only the columns you ticked, in the order shown.

Reading the results

Row and column counts describe the chosen array, not the whole file. A column is the union of every path seen in any row, so a field that appears in only one record still gets a column; the notes list which columns are missing in some rows.

Missing and null are different in JSON but both export as an empty CSV cell. In the table a real null shows as the word null, and a missing key shows as blank, so you can still tell them apart before exporting.

A mixed-type warning means the same path holds, say, a number in one row and a string in another. That usually points to a producer bug or an optional field that changed shape, and it matters when the CSV goes into a typed database column.

Worked example: finding the paid orders in an API response

Load the API orders example. It is a page of an orders endpoint: a pagination block plus a data array of six orders, each with a nested customer object and an items array. The explorer offers $.data first (six items, six objects) ahead of the nested $.data[0].items.

Flattened, the six orders produce 12 columns: id, status, total, currency, created_at, customer.id, customer.name, customer.country, items, coupon, error.code and error.retryable. The notes flag that coupon, error.code and error.retryable are missing in five of the six rows - only one order used a coupon and only one failed.

Filter status equals paid and three rows remain: orders 1001, 1003 and 1005, with totals of 129.50, 310.99 and 76.00. Sort by total descending to get 1003, 1001, 1005. Untick everything except id, customer.name and total and the CSV download holds exactly those three columns and three rows - totalling 516.49, which you can check by hand.

How flattening works

Each object key becomes part of a path joined with a dot: {"customer": {"name": "Ada"}} becomes the column customer.name. Columns appear in the order they are first met, so the table follows the shape of your first record. An empty object is shown as {} rather than silently disappearing.

Arrays inside a row are the hard part of any JSON-to-table conversion, because one order can have one item and another fifty. Keeping them as JSON text is the safe default: one row per record, nothing lost. Expanding them by index is useful for short, fixed-length arrays such as coordinates, and is capped at 50 items per array and 500 columns overall. If you need one row per item instead, pick the nested array itself - $.data[0].items - or reshape the data first.

Exports and spreadsheet safety

CSV exports follow RFC 4180: fields containing commas, quotes or line breaks are quoted, and the file starts with a UTF-8 byte order mark so accented names and emoji open correctly in Excel. Any text cell that begins with =, +, - or @ gets a leading apostrophe, the OWASP-recommended defence against CSV formula injection, so a value from an untrusted API cannot run as a spreadsheet formula when someone opens the file.

JSON exports rebuild nested objects from the dotted column names you kept, so the output has the same shape as the input, minus the columns you dropped and the rows you filtered out.

Limitations: what the result does not prove

  • It reads JSON as data; it does not validate it against a schema. Use a JSON Schema validator when you need to prove a document follows a contract.
  • Only the first element of a nested array is inspected when listing arrays, on the assumption that records repeat their shape. An array whose later elements hold further arrays at new paths will not list those paths until you pick it.
  • Numbers are held as JavaScript numbers, so integers beyond 9,007,199,254,740,991 (such as some 64-bit IDs sent as numbers) lose precision on parsing. Producers that care send those IDs as strings.
  • Duplicate keys in one object are resolved the way JSON.parse does - the last one wins - without a warning.

Privacy: where your data goes

Everything you paste, type or drop is processed in this browser tab. It is not uploaded, logged, stored or sent to analytics. Session recording and tag-manager scripts are switched off on this page.

Standards and sources

Frequently asked questions

How do I turn a nested JSON API response into a spreadsheet?

Paste the response, choose Explore, and pick the array that holds the records - usually something like $.data or $.results. Nested objects become dotted columns automatically. Untick the columns you do not need and download CSV; it opens directly in Excel, Numbers or Google Sheets.

What is JSON Lines and does this read it?

JSON Lines (also called NDJSON) is one complete JSON value per line, common for logs and data exports because it can be streamed. If the whole text is not valid JSON but has several lines, each line is parsed as a separate record and the records become the rows. A bad line is reported by its line number.

What happens to arrays inside each record?

By default an inner array stays in one cell as JSON text, so each record is still one row and nothing is lost. You can switch to indexed columns such as items.0.sku and items.1.sku, which suits short fixed-length arrays; long arrays are left as text to avoid thousands of columns.

How large a JSON file can the explorer open?

Up to 50 MB, 64 levels of nesting and 200,000 rows in the chosen array. Files over 2 MB are not copied into the text box, because a huge textarea slows the page; they are parsed directly. Beyond those limits you get a message saying which one was reached rather than a frozen tab.

Is my JSON uploaded anywhere?

No. The file is read with the browser's FileReader and parsed with the built-in JSON parser on your device. The page makes no network request containing your data, which you can confirm in the browser's developer tools on the Network tab.

Why does a column show blank in some rows and null in others?

Blank means the key does not exist in that record; null means the key exists with the JSON value null. Both export as an empty CSV cell, so check the table before exporting if the difference matters, for example when missing means unknown but null means deliberately cleared.

Can I export only the filtered rows and selected columns?

Yes. Both downloads contain only rows that pass the current filter, in the current sort order, and only the ticked columns. The JSON download rebuilds nested objects from the dotted names you kept, so customer.name goes back under customer.

Last reviewed by the A2Z.Tools team against the sources listed above.

Rate this tool

Was this tool useful? Your feedback helps us improve it.

No ratings yet — be the first to rate this tool.
Your rating (required)
0 / 2000

Please do not include passwords, payment details or other sensitive information.

Your feedback is sent privately to the A2Z.Tools team and will not be posted publicly.