Free JSON & JSONL Viewer Online

Drop a JSON file below, or paste the text, and read it two ways on this page: a flattened table you can sort, filter and measure, and a collapsible tree that shows the real shape with every node's JSONPath one click from your clipboard. Parsed in your own tab, so nothing is uploaded.

Two questions, two views

People open a JSON file for one of two reasons, and the tools usually only serve one of them.

The first reason is structural. You captured a response, or someone sent you a config, and you need to know what shape it is: which keys exist, how deep it goes, whether customer is an object or a string, what the path to the field you care about actually is. For that, a pretty-printer or a tree is right and a table is useless, because flattening the document is precisely what destroys the thing you are trying to see.

The second reason is analytical. The file is a list of four thousand records and you want to know how many are in each status, what the largest amount is, which rows have a null where they should not. For that, a tree is useless: nobody counts four thousand collapsible nodes. You want columns, a sort, a filter and a sum.

This page does both, from the same load, with a tab between them. The table opens first, because a data site is mostly used for the second question. The tree is one click away, renders lazily so a large document does not become a large DOM, and puts a JSONPath on your clipboard from any node.

What is on the page

Nested fields become dotted columns

A record whose customer.address.city is three levels down gets a column with exactly that name. What cannot be flattened into a cell is kept as JSON text rather than dropped, so nothing vanishes quietly.

A tree with copyable paths

Every node carries a copy path button that puts its JSONPath on the clipboard, bracket-quoting any key that is not a plain identifier. That path pastes straight into the JSONPath tester or into your own code.

Lazy rendering

A collapsed node holds nothing but its summary until you open it, and a node with thousands of children shows 200 at a time. A large document stays a large document rather than becoming a stalled tab.

JSONL and NDJSON too

One object per line, the format most log pipelines emit, reads as a table of records with no setting to find. An array of objects, or a single object wrapping one, works the same way.

Type and role badges

Every flattened column gets a type and a guess at its role, so a field you assumed was numeric but arrived quoted as a string is visible at a glance rather than after a confusing sort.

Statistics per column

The sigma in a header gives blanks, distinct count, min, max, mean, median, sum and the most common values, which is the fastest way to profile a payload you have never seen before.

Sort, filter, freeze

Click a header to sort, type in the box to filter as you go, and pin up to three columns to the left edge so the identifier stays visible across a wide flattened record.

Copy or export

Select a range and Copy as TSV, CSV, Markdown or JSON. Download CSV and .xlsx write the current view, which is how a nested payload becomes a spreadsheet in two clicks.

Paste, do not save

The Paste tab takes a response you copied out of a network inspector, so you never have to write a debugging payload to disk. Nothing is transmitted or kept either way.

A worked example

Take a small orders payload:

{
  "orders": [
    {
      "order_id": "ORD-20250",
      "status": "shipped",
      "customer": {
        "name": "Priya Raman",
        "address": { "city": "Austin", "state": "TX", "postal_code": "78701" }
      },
      "totals": { "subtotal": 620.00, "tax": 44.95, "currency": "USD" }
    },
    {
      "order_id": "ORD-20251",
      "status": "processing",
      "customer": {
        "name": "Arjun Mehta",
        "address": { "city": "Bedford", "state": "MA", "postal_code": "01730" }
      },
      "totals": { "subtotal": 106.25, "tax": 7.70, "currency": "USD" }
    }
  ]
}

The table tab gives you two rows and columns named order_id, status, customer.name, customer.address.city, customer.address.state, customer.address.postal_code, totals.subtotal, totals.tax and totals.currency. Note that 01730 arrives as 01730: it was a string in the JSON and it is a string in the grid, badged text / id rather than turned into 1730.

Click the sigma on totals.subtotal and you get min 106.25, max 620, mean 363.13, sum 726.25. Type status:shipped in the filter and the counter says 1 of 2 rows.

Now switch to the JSON tree tab. The root shows { 1 key }, orders shows [ 2 items ], and opening the first order and hovering city gives you a copy path button. What lands on the clipboard is:

$.orders[0].customer.address.city

That is the difference the tree makes. From the table you know there is a column called customer.address.city; from the tree you get the expression that addresses it, ready to paste into the JSONPath tester or into whatever is consuming the payload.

Things that trip up JSON viewers

  • Records with different keys. Real payloads are ragged: some orders have a discount field and some do not. The table takes the union of the keys, and the rows that lacked one show blank rather than shifting their values into the wrong columns.
  • Arrays inside records. An order with three line items cannot become one flat row without losing something. Rather than pick a winner, the array is kept as JSON text in its cell and stays visible in the tree, where its real shape is.
  • Numbers that are secretly strings. "amount": "1200.50" and "amount": 1200.50 look identical in a table. The type badge on the column is where the difference shows up, and it is worth checking before you trust a sort.
  • Deep nesting. Flattening has to stop somewhere or a recursive structure produces infinite columns. What is beyond the flattening depth is preserved as JSON text in a cell, and the tree shows all of it.
  • A single object rather than a list. A config file is one object, not an array of records. It still opens: you get a one-row table, and the tree is the view you actually want.

Frequently Asked Questions

How do I view a JSON file without uploading it?

Drop the file on the box at the top of this page, or paste the text into the Paste tab. It is parsed by JavaScript in your own tab and drawn immediately as a table, with a JSON tree one click away. Nothing is transmitted, which matters because JSON payloads captured while debugging routinely contain tokens, emails and customer records.

What is the difference between the Table and JSON tree tabs?

The table is your array of records flattened into columns, which is what you want for sorting, filtering, column statistics and exporting to CSV. The tree is the document as it is actually shaped, with every node collapsible and every node's JSONPath copyable in one click. Flattening answers how many and how much; the tree answers what shape is this and where does that field live.

How does nested JSON become a table?

Nested objects are flattened with dotted paths, so customer.address.city becomes a column called customer.address.city. Arrays of objects that cannot be flattened into a single row are kept as JSON text in one cell rather than being silently dropped, so nothing disappears without you seeing it. If the flattening is not the shape you want, the tree tab shows the original.

Does it read JSONL and NDJSON?

Yes. One JSON object per line, the format most log pipelines and data exports emit, is read as a table of records with no configuration. A plain .json file holding an array of objects, or a single object with an array inside it, is handled the same way. The file extension does not have to match; the content decides.

How do I copy the path to a field?

Switch to the JSON tree tab and hover any node. A copy path button appears and puts the JSONPath on your clipboard, for example $.orders[0].customer.address.city. Keys that are not plain identifiers are bracket-quoted correctly, so a key with a space or a hyphen produces a path you can actually paste into a query.

Will very large JSON freeze the page?

No. The table only renders the rows on screen, so the row count is limited by memory rather than by the grid. The tree renders lazily: a collapsed node holds nothing but its summary until you open it, and a node with thousands of children shows the first 200 with a control to reveal more. The page ceiling is 250 MB, above which the full editor streams instead.

Can I export the table as CSV or Excel?

Yes. Download CSV and .xlsx write the current view, so filtering and sorting first gives you exactly the rows you want. For a fragment rather than the whole table, select a range and use Copy as, which offers TSV for a spreadsheet, CSV, a Markdown table, or JSON objects keyed by column name.

What happens if the JSON is invalid?

You get the parser's complaint rather than a blank page: what was wrong and where. For a document that will not parse at all, the JSON formatter reports the error by line and column and is the quickest way to see the structure of something that is valid but unreadable.

Read the payload, then read its shape

A table for the counting, a tree for the structure, and the JSONPath on your clipboard. Nothing uploaded.

Back to the viewer