View JSON as tables you can sort and filter

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.

How it works

  1. Paste JSON or JSON lines, or load a .json file
  2. Pick a table from the list, then sort, filter and hide columns
  3. Copy or download the current view as CSV or JSON

How the tables are found

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.

Nested values

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.

Filter, sort and highlight

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.

Export and limits

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.

Frequently asked questions

How do I view an IndexedDB dump as a table?

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.

Can it open JSON lines or NDJSON files?

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.

How do I filter rows where a field is 0 or empty?

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.

What happens to a field that holds an object or an array?

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.

Why do I see a (key) or (value) column?

(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.

Is my JSON uploaded?

No. The text is processed in your browser, in this tab, and no server receives it. Nothing you paste or load is saved.