Paste JSON or JSON lines, or open a .json file. Every list of objects becomes a table with sort, filter, hidden columns and CSV or JSON export.
To view JSON as a table, paste it here and every list of objects in the document becomes a table, wherever it sits. A list counts as a table when at least half of its items are objects. The columns are the union of all keys in first-seen order, so a row that lacks a key shows an empty cell. A row that is not an object, such as a bare string, goes in a column named (value). An object whose values are all objects with plain fields, such as Firestore documents keyed by id, becomes a table with a (key) column. The list on the left shows each table with its path and row count, for example $.stores.attempts with 6 rows. The largest table opens first. If the document has no list of objects, you get the whole document as one row. JSON lines (NDJSON), one object per line, are read as one table. A line that is not valid JSON is reported by line and column, without repeating your text.
An object inside a row shows as {3 keys} and an array as [5]. Click it to expand the pretty-printed JSON in place. An array of objects also gets an Open as table button, which drills into it as its own table with the path shown above it, such as $.orders[0].items, and a Back button. The inside of a table is not searched for further tables on its own, so a list of 10,000 orders does not create 10,000 item tables. Strings are cut at 200 characters in the cell; the filter and the export still use the full value. Numbers are read as JavaScript numbers, so integers beyond 9,007,199,254,740,991 lose digits, and that is the one case where the table can differ from the file.
Text in the filter box must appear somewhere in the row, in any case, including inside nested values, and matches are highlighted in plain cells. A column condition uses the column name, an operator and a value: attempts = 0, score >= 80, quiz <> fractions, name contains en, tags is empty, score is null, profile.city = Pune, tags.length > 1. Join conditions and text with && (or with the word and when every part is a condition). A name that is not a column is searched as text, and a note says so. Worked example with the sample, an IndexedDB-style dump with a users store of 4 rows and an attempts store of 6 rows: attempts = 0 keeps 2 of 6 rows (ids 102 and 104), and sorting score from high to low puts 105 (91), 101 (82), 106 (77) and 103 (64) first with the empty scores last. Sorting is by number, text with natural order (file2 before file10), or true after false; empty cells go last either way.
Copy CSV, Copy JSON, Download CSV and Download JSON use the current view: the filtered rows, in the sorted order, with only the visible columns. CSV has a header row, quotes values that need it and writes nested values as JSON text. A text cell that starts with =, +, - or @ gets a leading apostrophe so a spreadsheet shows it as text instead of running it as a formula. The text can be up to 20,000,000 characters and a file up to 20 MB. A table keeps up to 200 columns and 500,000 rows, the page shows 25 to 250 rows at a time with Previous page and Next page, and the search for tables stops at 300 tables or 3,000,000 objects and lists. An AI agent can open this page with up to 100,000 characters of JSON already pasted, using #input= followed by the URL-encoded text. The JSON is processed in your browser and not uploaded, and it is not saved.
Dump the database to JSON, for example with a short script that reads each object store, so you have an object of stores such as {"users": [...], "attempts": [...]}. Paste it here and each store appears in the table list with its row count. Pick one, then filter with a condition like attempts = 0.
Yes. A file with one JSON value per line, for example a .jsonl log of 50,000 events, is read as one table with a row per line. Blank lines are ignored. If line 812 is broken, the message says Line 812 and the column, and the rows before it are not shown.
Type a condition in Filter rows: attempts = 0 keeps rows where attempts is the number 0 (or the text 0). score is null keeps rows where score is null, and notes is empty also keeps missing, empty text, [] and {}. Join two with &&, for example attempts = 0 && quiz = decimals.
It shows as a short chip, {2 keys} or [4]. Click the chip to expand the JSON in the cell. For an array of objects, Open as table shows it as its own table, and Back returns to the one you came from.
(key) appears for an object keyed by id, such as Firestore documents, and holds each id. (value) appears when a row is not an object, for example a list of strings or numbers. Hide either from Columns if you do not want it in the export.
No. The text is processed in your browser, in this tab, and no server receives it. Nothing you paste or load is saved.