Format · Validate · Tree · JSONPath · Diff · Schema
Private Runs in your browser. Your JSON stays on this page — nothing is sent to Mungomash, and no third-party API is contacted for the analysis.
Inferred draft 2020-12 skeleton. Refine before using as a contract.
Supports $, .key, ["key"], [0], [*], and ..key recursive descent.
JSON in 60 seconds
JSON — JavaScript Object Notation — is a small, strict text format for structured data, standardized as RFC 8259 and ECMA-404. A JSON document is exactly one value, where a value is either an object ({ … }), an array ([ … ]), a string (always double-quoted), a number, a literal true / false, or null. There is nothing else.
Object keys are strings, always quoted. Whitespace between tokens is ignored. There are no comments, no trailing commas, no single quotes, no undefined, no functions, no dates — all of those are extensions either ad-hoc (undefined) or in JSON5, which the lenient mode above accepts. The minimalism is the point: a JSON parser is a few hundred lines of code in any language, and any compliant parser accepts any compliant document.
The errors that hand-edited JSON ships with
Strict JSON rejects four common things that look fine to a human:
- Trailing commas.
[1, 2, 3,]and{ "a": 1, }are syntax errors. Most editors auto-insert a trailing comma when reformatting; strict JSON does not allow them. - Single quotes.
{ 'a': 1 }is a syntax error — only double quotes are legal for strings and keys. - Unquoted keys.
{ a: 1 }is a syntax error — this is how JavaScript object literals look, but JSON requires the key be a quoted string. - Comments.
// noteand/* note */are syntax errors. JSON has no comment grammar at all.
JSON5 (the .json5 file extension) is an unofficial superset that allows all four. VS Code's settings.json is in this dialect; so are most TypeScript tsconfig.json files in practice (TypeScript's compiler accepts // comments). The lenient toggle above accepts these and emits strict JSON, so you can paste a JSON5 file, format it, and copy the strict equivalent.
Tree view, JSONPath, and the “deeply nested” problem
A 50,000-line JSON response from an API is unreadable as text and almost unreadable in a Pretty view. The Tree tab above renders the parsed value as a collapsible outline — click any object or array to fold it, click again to expand. Each collapsed node shows a summary ({4 keys} / [12 items]) so you don't lose context. The page starts with the top two levels expanded and everything below collapsed; the Expand all and Collapse all buttons jump between extremes.
Once you know roughly where to look, the JSONPath bar shortcuts the navigation. The supported expressions:
$— the root document.$.keyor$["key"]— a property by name.$.array[0]— an array element by zero-based index.$.array[*]or$.object.*— every element of an array, every value of an object.$..email— recursive descent: everyemailproperty anywhere in the tree.
Filter expressions ([?(@.age > 18)]) are deliberately not supported — the page is for inspection, not full querying. For real query work, reach for jq or a database.
Diff — what changed?
The Diff toggle reveals a second textarea. When both contain valid JSON, the page walks both documents in parallel and reports three classes of change:
- Added — a path present in the right that's missing from the left.
- Removed — a path present in the left that's missing from the right.
- Changed — a path present in both with a different value.
Arrays diff positionally — index [0] on the left vs index [0] on the right. That's correct for diffing two snapshots of the same response, but reports unhelpful churn if elements are inserted at the front of an array. Smarter array diffing (matching by an id key) is on the v2 list.
Schema inference
The Schema tab generates a JSON Schema draft 2020-12 skeleton from the input — type, properties for objects, items for arrays. It's a starting point, not a contract: only required vs optional, value ranges, string formats, and enum constraints can come from the developer who knows what the field is supposed to mean. Use the inferred shape as a draft, then tighten it by hand.
Privacy — the actual mechanics
Every operation on this page — parsing, formatting, validation, the tree, the JSONPath query, the diff, the schema — runs in your browser's JavaScript engine. The page makes zero network requests for the analysis. The only network calls in the page's lifecycle are:
- Loading the page itself (HTML, the favicon, the logo) from
mungomash.com. - Loading the Tailwind CSS framework from
cdn.tailwindcss.com. - Loading the Google Analytics 4 tag for aggregate pageview metrics.
None of those carry the JSON you paste. You can verify by opening your browser's DevTools network tab, pasting a string, and confirming no further requests fire. Safe for production data, internal config, or anything containing secrets.