JSON structure analyzer

Report a JSON document's structure — nesting depth, node counts, key frequency, per-path types, and array stats. Runs in your browser, no upload.

Try:
Structure report

About this tool

JSON structure analyzer parses a JSON document and reports its shape — without transforming or reformatting the data. Paste any JSON value (object, array, or scalar) and you get:

Worked example

For {"users":[{"id":1,"name":"Ada"},{"id":2,"name":"Bo"}]} the report shows root type object, max depth 3 ($$.users$.users[]$.users[].name), key frequency id: 2, name: 2, users: 1, and the path $.users[] with 2 objects. The name field lands at $.users[].name as a string seen twice.

Options

Privacy

Everything runs in your browser via WebAssembly — your JSON is never uploaded. The tool is also available from the gizza CLI and in chat, which return the report as structured JSON.

FAQ

How is nesting depth counted?

The root value is depth 0, and each step into an object or array adds one. So {"a":1} is depth 1, {"a":{"b":1}} is depth 2, and a scalar like 42 on its own is depth 0. Depth over 5 levels raises a "deep nesting" warning, since deeply nested data is harder to read and query.

What does the per-path type distribution show, and why collapse array indices?

Each path is written with $ for the root, .key to descend an object, and [] to descend an array — so all elements of an array share one path ($.users[] rather than $.users[0], $.users[1], …). That collapse is what makes a mixed-type field jump out: if $.items[].price reports ["number", "string"], some prices are strings. Paths are ranked by how many nodes were seen at each one.

What counts as an "empty value"?

An empty value is a null, an empty string (""), or an empty object/array ({} / []). They're counted together in the empty_values total and surface a warning, which is handy for spotting placeholder fields or optional data that never got filled in.

Can it handle very large JSON, and what about invalid JSON?

Large documents are fine — parsing and the single walk are linear, and the whole thing runs locally so there's no upload size limit beyond your browser's memory. If the input isn't valid JSON, you get a clear parse error (with the position) instead of a partial report, so you know exactly what to fix.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool json-structure-analyzer '{ "users": [ { "id": 1, "name": "Ada" }, { "id": 2, "name": "Bo" } ] }'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/json-structure-analyzer/?json=%7B%20%22users%22%3A%20%5B%20%7B%20%22id%22%3A%201%2C%20%22name%22%3A%20%22Ada%22%20%7D%2C%20%7B%20%22id%22%3A%202%2C%20%22name%22%3A%20%22Bo%22%20%7D%20%5D%20%7D&format=json&top_keys=30&top_paths=50

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.