JSON to Table Converter
Start with JSON
Paste JSON on the left or load a sample to preview the table.
Turning an Array of Records Into Rows
An array of similar objects is a table that has not been drawn yet. Every record in [{"msisdn": "447700900142", "plan": "Unlimited 5G"}, …] carries the same keys, which are the columns; the records are the rows. Pretty-printing that document does not help, because indentation makes it taller without making the repetition visible. Paste it on the left here and the right-hand pane draws the table the data was already describing — sortable by clicking a header, filterable per column, searchable across all of them at once.
Two things about how it does that are worth knowing before you trust the output. Nested values are not flattened into network.cellId-style columns: an object or an array keeps its own column and renders as a small table inside the cell, so network stays one column and you expand it in place. And number literals are read out of your source text rather than converted to JavaScript numbers first, which is the difference between a cell reading 8901240544102066246 and a cell reading 8901240544102066000 — the second is what a plain JSON.parse gives you for a 19-digit ICCID, silently, because JavaScript numbers are doubles and run out of precision at about 15 digits.
A single object works too — you get one row. What does not work is a bare scalar or an array of strings, because neither has anything that can become a column; the pane says so rather than drawing an empty grid. The document itself has to be valid RFC 8259 JSON: no trailing commas, no comments, double quotes only. If yours came out of a JavaScript file and has any of those, the JSON Fixer is the faster route in.
Getting From a Payload to a Readable Grid
- Paste the JSON – Drop it into the left editor. The table redraws about a third of a second after you stop typing, so pasting a large document does not fight you mid-keystroke. "Sample" loads a three-record subscriber lookup if you want to see the shape first.
- Sort and filter – Click a column header to sort, use the per-column filter boxes to narrow one field, or the search box to match across every column at once. The row count above the table tracks whatever is left after filtering.
- Expand what is nested – A cell holding an object or an array renders a sub-table inline rather than printing [object Object]. "Expand All" and "Collapse All" open or close every one of them in a single click, which is the fast way to scan a column of small objects.
- Flip the table when there are more columns than rows – One record with twenty fields reads badly across the screen. "Flip Table" transposes it — keys become rows, records become columns — which is the shape you want for comparing two or three subscribers field by field. "Flip Nested" does the same to the sub-tables inside the cells, independently.
- Export to Excel – The "Excel" button downloads the table as JsonConvertedToExcel.xls, sub-tables and all, honouring whichever flip state is on screen. It exports the filtered rows rather than the whole document, so narrow the table first and the spreadsheet arrives already narrowed.
- Maximize, or save a link – "Maximize" gives the table the whole window, useful once you have more columns than the split pane can hold. "Save" is the one button that touches the network — it stores the document and hands back a link that reopens it.
Pro Tip: The search box looks inside nested cells, not just at the columns you can read. Searching AB12-9D1 matches a record whose sectors array contains it even while that cell is collapsed, because each cell is serialised back to JSON before the match runs. It is the quickest way to answer "which subscriber touched this cell" without expanding anything.
Example
A list of active mobile subscribers returned from an HSS lookup: three records with the same five keys, so five columns and three rows. The cells below are plain text because that is what the live table renders — values are printed as they are, with no colour coding and no right-alignment for numbers.
[
{ "msisdn": "447700900142", "imsi": "234150999912345", "plan": "Unlimited 5G", "roaming": true, "rsrp": -92 },
{ "msisdn": "447700900458", "imsi": "234150999967810", "plan": "Pay As You Go", "roaming": false, "rsrp": -104 },
{ "msisdn": "447700900773", "imsi": "234150999934562", "plan": "Business 200GB", "roaming": true, "rsrp": -78 }
]| msisdn | imsi | plan | roaming | rsrp |
|---|---|---|---|---|
| 447700900142 | 234150999912345 | Unlimited 5G | true | -92 |
| 447700900458 | 234150999967810 | Pay As You Go | false | -104 |
| 447700900773 | 234150999934562 | Business 200GB | true | -78 |
Common Use Cases
Finding the odd record in an API response
Two hundred records come back and one of them is wrong. Reading them as JSON means scrolling; reading them as a table means sorting the suspect column and looking at the ends. Nulls sort together, an empty string is visible as a blank cell where every neighbour has a value, and a field that only some records carry shows up as a column that is mostly empty — the union of keys across all records becomes the column set, so a field added halfway through the export is not hidden by the first record's shape.
Reading a MongoDB or Firebase export
Document-store exports are arrays of objects with drifting shapes, which is exactly the case a table exposes and a text editor hides. One thing to expect from Mongo specifically: mongoexport writes Extended JSON, so an _id arrives as {"$oid": "…"} and a date as {"$date": …} — those render as nested cells here rather than as the bare values you might have expected, which is correct but surprising the first time. Sort by _id to spot duplicates, filter one field to isolate a tenant, and expand the nested sub-documents only on the rows you care about. If the next step is a spreadsheet or a load job, the Excel button and JSON to CSV both take the filtered view rather than the raw file.
Comparing a handful of records field by field
Three subscribers, twenty fields each, and the question is which field differs. Left to right that is unreadable — twenty columns do not fit. Press "Flip Table" and the orientation inverts: field names run down the left, each subscriber gets a column, and the differing row is the one your eye lands on. It is the same trick a spreadsheet user reaches for with paste-special-transpose, and it is why the button is on the page. For a mechanical answer across two whole documents, use JSON Diff instead.
Frequently Asked Questions
Is my JSON data safe when I use this tool?
Converting it is safe: the parsing and the table both happen in your browser, and nothing is sent anywhere to make them work. Disconnect from the internet after the page loads and it still converts. There is one exception worth knowing about — the Save button, the one with the cloud icon. Press it and the document is stored on our server so the link you get back opens for whoever you send it to, for a period you choose. That only happens when you press it deliberately; the Excel export, by contrast, is built in the browser and never leaves it. The privacy policy covers what is stored and how to have it deleted.
What happens if my JSON has errors?
The table is replaced by the parser's own message, which usually names the offending token and its position — Expected ',' or '}' after property value in JSON at position 214 is the shape of it. Missing comma, unclosed bracket, a trailing comma copied out of JavaScript, and smart quotes pasted from a document account for most of them. There is also a second message that is not a syntax error at all: JSON must contain objects means the document parsed fine but is an array of strings or numbers, so there is nothing to make columns out of. If the file came from somewhere you cannot edit, the JSON Fixer will attempt a repair, and Stack Overflow's JSON tag covers the unusual cases.
How large a file can it take?
There is no size limit in the code, and no streaming or virtualisation either — being honest about that is more useful than a number. The whole document is parsed and flattened up front on every change, which is the part that costs; the grid itself paginates at ten rows, so painting stays cheap however many records you have. In practice a few thousand records is comfortable and a document of several megabytes will make the tab pause on each edit. Past that, slice the part you need out with jq first — the jq manual's section on selecting is enough to write the filter — or convert it to CSV and open it in something built for volume.
How do I view nested objects and arrays?
They are already there. A cell whose value is an object or an array renders that value as a small table inside the cell rather than flattening it into extra columns, so network stays one column. "Expand All" and "Collapse All" open or close every one of them at once, and "Flip Nested" transposes the sub-tables without touching the main table's orientation — useful when the inner objects have more keys than the cell is wide.
Why is my long ID showing all its digits here but not elsewhere?
Because most tools parse JSON with the language's built-in parser, and in JavaScript that turns every number into a 64-bit double with roughly 15 to 16 significant digits. A 19-digit ICCID such as 8901240544102066246 does not fit, so it comes back rounded to 8901240544102066000 — no error, no warning, the last three digits simply replaced with zeros. Number literals are read out of your source text here instead, so the cell shows what you pasted. Click "Sample" and look at the iccid column to see it.
Does this work on mobile devices?
Yes. Below 768px the split pane stacks — editor above, table below — instead of sitting side by side, and the table scrolls horizontally rather than crushing the columns. Long documents are still easier on a laptop, but reading a payload someone sent you works fine on a phone.