Source document
Paste JSON once — every tab reads the same document. Nothing is uploaded, and nothing is stored unless you ask.
Paste or drop a JSON document to begin.
Format, minify & repair
Validation errors carry a real line:column. Repair is a
separate, explicit step and reports every change it makes.
Query studio
JSONPath, plain dot-notation, or filter(...). Filter
expressions are parsed and walked, never evaluated as script.
Try items[0].id, $..price, or filter(price > 50).
Tree explorer
Nodes build as you expand them, so a large document stays responsive. Click any node to put its path in the breadcrumb.
Waiting for a document.
Convert
Each converter states its own limits — none of them guesses at input it cannot represent faithfully.
Waiting for a document.
Compare
The source document above is the left side. Both sides are canonicalised before comparing, so two documents that differ only in key order come back identical.
Paste a second document to compare it with the source.
What this does, and where it stops
Every tab reads one source document, parsed once. The page declares
connect-src 'none', so it cannot make a network request even if
something in it tried to — no upload, no fetch, no analytics. People paste
API responses and config files into JSON tools, and sending either to
someone else's server is a poor trade.
The parser
Validation runs through the browser's own JSON.parse, so what
this page calls valid is exactly what your runtime will. When it fails, the
error is resolved to a line:column with the offending text
excerpted — a byte offset is technically the same information and useless
in practice. The repair pass fixes only unambiguous things (trailing
commas, single quotes, unquoted keys, comments) and reports each change it
made rather than handing back a silently rewritten document.
Query
Two dialects, both implemented here: dotted paths with bracket indexing
(items[0].id), and a small JSONPath subset including the
recursive descent $..price. filter(price > 50)
is a deliberately narrow comparison form — not an expression language, and
never eval.
Compare
The Compare tab canonicalises both documents — keys sorted
at every depth, one fixed indent — and then runs the same Myers diff that
powers the diff checker. That is
what makes it structural: {"a":1,"b":2} and
{"b":2,"a":1} are the same document, and a text diff has no way
to know it. Array order is left alone, because in JSON it means something.
Limits
- 5 MB per document. Larger input is refused rather than silently truncated.
- The tree view renders children on demand. A very wide node is capped and says so rather than freezing the tab.
- YAML output covers the subset JSON can express — no anchors, tags or multi-document streams. CSV needs an array of flat objects, and says so when it does not get one.
- TypeScript interfaces are inferred from one sample document, so an optional field that happens to be absent will be typed as absent.
- Nothing is stored unless Remember my document is on, and turning it back off deletes what was kept.