JSON Navigator

Load a response, walk the structure with arrow keys, and copy the path to any field. Search checks every key and every value at once, so something buried nine levels down takes one keystroke to reach.

JSON tree navigation workspace

Load a sample:

Source document

Paste JSON above, or load one of the samples.
Select a row to see its path
Nothing to show yet. Paste a document above or pick a sample.
Nodes 0Max depth 0Objects 0Arrays 0Longest array 0Click a row, then to move and Enter to copy the path

Reading JSON is easy. Locating one field inside 4,000 lines of it is the real work.

A response you wrote yourself reads fine. A response somebody else wrote, eleven levels deep with three arrays of objects in the middle, turns into a search problem. You know the field is called tax_rate. You do not know whether it sits under order.totals, on every line item, or in both places holding different numbers.

This page answers that question rather than the formatting one. Paste a document and the tree opens two levels, which shows the shape without a wall of text. Type into the search box and every key and every value is checked in one pass, with a match count beside the box and arrows to step between hits. Select any row and the bar above the tree fills in with the full path, ready to copy.

From a paste to a working path in four moves

  1. Drop the document into the input panel, or pick one of the three samples. Parsing runs while you type, so a broken file reports its line and column instead of leaving you with an empty tree.
  2. Press Hide input once the tree renders. The panel folds away and the tree takes the full width, which pays off on data that nests past four or five levels.
  3. Type a field name into the search box. Hits are counted, marked amber, and the two arrows step through them one at a time. Switch on Only matches to drop every branch holding nothing you asked for.
  4. Select the row you were after and press Copy path. Out comes $.results[0].settings.notifications.digest, ready for a jq filter, a JSONPath expression, or a line of application code.

Dot path or JSON Pointer, and which one your next tool expects

The same field has two standard written forms, and picking the wrong one produces a syntax error rather than a wrong answer, so the two buttons sit side by side above the tree.

$.results[0].settings.theme
Dot notation, the form jq, JSONPath libraries and most template languages read. Keys that are not plain identifiers come out bracketed and quoted, so a header name writes as ["content-type"] instead of breaking at the hyphen.
/results/0/settings/theme
JSON Pointer, defined by RFC 6901. This is what JSON Schema validation errors quote, what an OpenAPI $ref holds, and what a JSON Patch operation targets. A key containing a slash or a tilde is escaped as ~1 and ~0.

Choose by whatever reads the path next, not by preference. A schema validator rejects dot notation outright, and jq has no idea what to do with a pointer.

Long arrays arrive in blocks of 200

An array of 12,000 entries rendered in one pass creates 12,000 rows, and the browser locks up before the first one paints. Children load here in blocks of 200, with a button at the foot of each block that pulls the next set. The count on the parent row always reports the real total, so 12000 items stays accurate while 200 rows are drawn.

Search works on the parsed data rather than the drawn rows, so a value sitting in entry 9,842 is still found when that row was never rendered. Stepping to the hit loads the blocks in between along the way.

Keyboard control, because a mouse is the slow way through a tree

Click any row once and the tree takes focus. From there the arrow keys do the moving, and your hand never leaves the keyboard.

KeyWhat happens
↑ and ↓Move between rows currently on screen, skipping anything collapsed
Open the selected branch, or drop into the first child when the branch is already open
Close the branch, or jump up to the parent when it is already closed
EnterCopy the dot path of the selected row
*Open every branch, chunk buttons on long arrays aside
Enter in the search boxStep to the next hit, with Shift for the previous one

Everything runs in the tab

Parsing, searching and the tree all happen in the page. No upload, no API call, no request in the path between your clipboard and the screen. JSON pasted into a browser tool routinely carries session tokens, database connection strings and customer records, so a round trip to a server buys nothing and risks plenty. Cut your connection after the page loads and the tool keeps working.

One behaviour worth knowing before you trust a number you read here. The tree is built with JSON.parse, which turns every number into a JavaScript double. Integers past roughly 15 digits get rounded, so a 19 digit Discord or Twitter ID displays with the last few digits changed. The JSON Beautifier keeps the original digits as text if you need to read one exactly.

Where this tool stops

Questions that come up while working through a document

Paths, search behaviour and the limits of a browser based tree.

How do I find a key when I have no idea where it sits?

Type it into the search box. Matching runs across every key and every value in the parsed document at once, not only the rows currently drawn, so a field nine levels down inside the eighth element of an array still turns up. The counter next to the box reports how many hits exist and the arrows step through them, opening branches on the way.

What is the difference between the dot path and the pointer buttons?

They are two written forms of the same location. Dot notation looks like $.results[0].settings.theme and suits jq, JSONPath and template languages. JSON Pointer looks like /results/0/settings/theme and is the form used by JSON Schema errors, OpenAPI $ref values and JSON Patch. Pick whichever the tool reading it next accepts, since neither parses the other.

Why do my long ID numbers show the wrong digits?

The tree is built with JSON.parse, which converts every number to a JavaScript double. Doubles hold about 15 digits of precision, so a 19 digit snowflake ID such as 1234567890123456789 comes back as 1234567890123456800. The rounding happens during parsing, before anything is drawn. Use the JSON Beautifier when you need to read a long number exactly, since it keeps the digits as text.

Can I search inside one branch instead of the whole document?

Not directly. Search always covers the full document. The closest thing is the Only matches toggle, which hides every branch holding no hit and leaves you with the paths that do, which usually makes the pattern obvious in a few seconds. For anything more selective, copy the branch with Copy value and paste it back into the input panel on its own.

Will an array with thousands of entries load?

Yes, in blocks of 200. Drawing thousands of rows at once freezes the tab, so each block ends with a button that pulls the next set. The count on the parent row always shows the true total. Search is unaffected because it runs over the parsed data rather than the drawn rows, and stepping to a deep hit loads the intervening blocks automatically.

Is my JSON uploaded anywhere?

No. Parsing, search and the tree all execute in your browser, and the page makes no network request once it has loaded. Switch off your connection after the page appears and every feature keeps working. That design matters here because API responses pasted into JSON tools frequently contain auth tokens and personal data.

I pasted a document and the tree stayed empty. What went wrong?

The document failed to parse, and the red bar under the input panel names the line, the column and the reason. Single quoted strings, unquoted keys, trailing commas and comments are the usual causes, all of which are legal in a JavaScript file and illegal in JSON. Fix the flagged line and the tree appears without any further action.

Can I copy a whole branch rather than a single value?

Yes. Select an object or array row and press Copy value. You get the entire subtree written out with two space indentation, which is handy for pulling one record out of a large response and pasting it somewhere smaller. On a leaf row the same button copies the raw value with no quotes added.

What do the counters under the tree mean?

Nodes counts every value in the document including leaves. Max depth is the longest chain of nesting from the root. Objects and arrays count the containers. Longest array reports the largest array found anywhere, which is the number that usually explains why a response is slow to render in an application.