From records to rows
Most JSON that people want to read as a table is an array of objects: API results, database exports, analytics events. Each object becomes a row and each key a column, in the order keys first appear. Rows that lack a key leave that cell empty, and a JSON null is shown in italics as null, so missing and null values stay distinguishable.
If the document holds several arrays, for example users and teams in one response, the Array menu lists each of them by its JSONPath with its item count, arrays of objects first. The tool picks the largest array of objects to begin with. Arrays nested inside rows are not offered as separate tables; they appear as compact JSON in their cell, such as ["book","pen"].
Flattening nested objects
With Flatten nested objects on, an object inside a row becomes one column per leaf in dot notation: customer.name, customer.address.city. This is usually what you want for spreadsheets and quick comparisons. Turn it off to keep each nested object in a single cell as compact JSON, which keeps wide records readable.
When a key already contains a dot and collides with a flattened path (a key named a.b next to an object a with a key b), both columns are kept and the second is labelled a.b (2), so values are never merged. Numbers keep their exact digits in every cell, including 64-bit IDs that JavaScript would round.
Sorting, filtering and choosing columns
- Click a column header to sort ascending, again for descending, and a third time to restore the original order. Numbers sort as numbers, and text sorts naturally, so
item2comes beforeitem10. The sort is stable, so rows that tie keep their relative order, which lets you sort by one column and then another. Empty and null cells always go last. - Filter rows keeps rows containing the text, ignoring case, in any visible column or in the one column you pick from the in menu.
- Columns lists every column with a checkbox; hide the ones you do not need, or use Show all to bring them back.
The line under the toolbar always says how many rows and columns are showing out of the total, and the # column gives each row’s position in the source array, so you can find it again after sorting.
Exporting what you see
The exports follow the table on screen: visible columns in their order, filtered rows in their sorted order.
- CSV is UTF-8 with a byte-order mark, so Excel opens accented names correctly. Fields with commas, quotes or line breaks are quoted.
- Excel produces a real .xlsx file with a bold, frozen header row. Numbers are stored as numbers, except ones a spreadsheet cannot hold exactly, which are kept as text rather than silently rounded.
- Copy as Markdown puts a GitHub-flavoured table on the clipboard for issues, pull requests and docs, with pipes escaped.
For conversions with more options, such as a different delimiter, use JSON to CSV. To browse deeply nested data rather than flat records, the JSON Viewer shows the full tree.
Large tables, kept private
Parsing and exports run in a background worker, and only the rows in view are drawn, so tables with tens of thousands of rows scroll smoothly. Up to 100,000 rows are loaded; beyond that the page tells you how many rows exist and that filtering, sorting and exports cover the loaded ones. Your data never leaves the browser. If the JSON does not parse, try JSON Repair.
Examples
Orders with a nested customer
Flattening turns the customer object into customer.name and customer.address.city columns; the items array stays as compact JSON. This is the table copied as Markdown.
[
{ "id": "A-1001", "total": 42.5, "status": "shipped", "customer": { "name": "Ada", "address": { "city": "London" } }, "items": ["book", "pen"] },
{ "id": "A-1002", "total": 189, "status": "pending", "customer": { "name": "Linus", "address": { "city": "Helsinki" } }, "items": ["laptop"] },
{ "id": "A-1003", "total": 7.25, "status": "shipped", "customer": { "name": "Grace", "address": { "city": "New York" } }, "items": [] }
]| id | total | status | customer.name | customer.address.city | items |
| --- | --- | --- | --- | --- | --- |
| A-1001 | 42.5 | shipped | Ada | London | ["book","pen"] |
| A-1002 | 189 | pending | Linus | Helsinki | ["laptop"] |
| A-1003 | 7.25 | shipped | Grace | New York | [] |A response with two arrays
The users array is shown first because it is the largest; switch the Array menu to $.teams to see the other table.
{
"generatedAt": "2026-10-01T08:00:00Z",
"teams": [
{ "id": "t1", "name": "Platform", "lead": "u2" },
{ "id": "t2", "name": "Payments", "lead": "u3" }
],
"users": [
{ "id": "u1", "name": "Ada", "team": "t1", "age": 36 },
{ "id": "u2", "name": "Linus", "team": "t1", "age": 54 },
{ "id": "u3", "name": "Grace", "team": "t2", "age": 85 },
{ "id": "u4", "name": "Margaret", "team": "t2", "age": 9 }
]
}Ragged rows and natural sorting
Sort by sku to get item1, item2, item10, item20; sort by stock to see null and missing values go last in either direction.
[
{ "sku": "item10", "price": "19.90", "stock": 4 },
{ "sku": "item2", "price": "5", "stock": null, "discontinued": true },
{ "sku": "item1", "stock": 120 },
{ "sku": "item20", "price": "1200", "stock": 0 }
]Common errors and how to fix them
| Error | Cause | Fix |
|---|---|---|
All columns are hidden | Every checkbox in the Columns menu was cleared, so there is nothing to draw or export. | Open Columns and choose Show all, or tick the columns you need. |
Only the first 100,000 of 250,000 rows are loaded | The array is larger than the table keeps in the browser at once. | Filter or split the data first, or use JSON to CSV, which converts every row. |
Unexpected end of input: 2 brackets are still open — '{' opened at line 1Explained | The export or API response was cut off before the end, so the array never closes. | Fetch or copy the data again; to salvage the rows that did arrive, run it through JSON Repair first. |
Frequently asked questions
What JSON shapes can be shown as a table?
Arrays of objects work best. Arrays of arrays get numbered columns, arrays of plain values get a single (value) column, and a single object is shown as a one-row table.
Why are some cells empty and others say null?
An empty cell means the row has no such key; null means the key is present with the value null. Both sort last, and both are empty in CSV.
Do exports include hidden columns or filtered-out rows?
No. CSV, Excel and Markdown exports contain exactly the visible columns and the rows that pass the filter, in the current sort order.
Will Excel round my large numbers?
Excel stores numbers as doubles, so values that cannot be held exactly, such as 20-digit IDs, are written as text to keep every digit. Ordinary numbers stay numeric for formulas.
Is the data uploaded anywhere?
No. Everything runs in your browser, and downloads are created locally.