JSON minifier
Minify JSON, beautify it back, and see the real compressed size. Flags duplicate keys your parser silently drops.
Escape JSON into a string, or peel every layer of escaping off a log payload. Handles double and triple escaping.
Paste an escaped payload from a log and get readable JSON back — every layer of it. Or go the other way and escape JSON into a string value. All in your browser.
processed in your browser · never uploaded
Straight from your log or console. The surrounding quotes are optional - paste it with or without them.
Or Ctrl and Enter. The direction is detected: escaped input gets unescaped, plain JSON gets escaped. Override it with the Auto, Unescape and Escape buttons.
The chain above the result shows every layer that was removed, and whether what came out is valid JSON or plain text.
Copy the result, save it, or use Minify this to carry it over to the JSON Minifier.
| Input | Output | Typical saving | Best for |
|---|---|---|---|
| Escaped string from a log | Readable JSON | Removes every layer at once | Debugging webhooks and queue payloads |
| Escaped fragment, no outer quotes | Readable JSON | Accepted, not rejected | Copy-paste straight from a console |
| JSON document | Single JSON string value | Adds bytes - that is the point | Storing JSON inside a JSON field |
We ran the same files through the popular alternatives first. These are the gaps we found, and what this tool does instead.
Peel every layer in one pass and show the chain, so you can see how deep the escaping went.
test: Paste the Sample. It is escaped twice - our result is readable JSON and the chain shows two layers.Put the quotes back and parse it anyway.
test: Paste {\"id\":1} with no quotes around it. Most tools return an error; this returns {"id":1}.Say plainly that the escaping was removed correctly and what was inside was plain text, or JSON that was broken before it was escaped.
test: Escape a plain sentence, then unescape it. The sentence comes back and the result is labelled plain text, not an error.JSON stringify turns a JSON document into a single string value that can be stored in a field, sent as a message body or written to a log. Unstringify does the reverse. The tool does both, and works out which direction you want from what you paste.
Escaping is what makes the round trip possible. A JSON string cannot contain a raw double quote, so every " becomes \", every backslash becomes \\, and every line break becomes \n. The result is valid JSON, and unreadable to a human.
This is the part that wastes an afternoon.
Escaping is not idempotent. Each time a payload passes through a service that stores it as a string, it is escaped again. A webhook body logged by a queue and then written to an aggregator arrives escaped two or three times over:
"{\"event\":\"order.created\",\"payload\":{\"id\":\"TV-40182\"}}"
Unescape that once and you get JSON. Start one layer further out and unescaping once leaves you with something that still looks broken, so you paste it into the tool again, and again, guessing at how deep it goes.
This tool peels every layer in one pass and shows the chain it removed, so you can see that the payload was escaped three times rather than wondering whether you are done.
Copying an escaped payload out of a log rarely brings the surrounding quotes with it. What lands in your clipboard is this:
{\"id\":1,\"ok\":true}
That is not parseable JSON – it is the inside of a string with no string around it – so most tools reject it. This one puts the quotes back and parses it anyway.
Paste JSON, choose Escape, and you get a single string value ready to assign to a field in another document. Two options change the output:
Wrap in quotes includes the surrounding double quotes, as a real JSON string value has. Turn it off when you are pasting into something that supplies its own quotes.
Escape non-ASCII turns accented and non-Latin characters into \u sequences. JSON is UTF-8 and does not require this, but some older parsers, database drivers and terminal tools handle pure ASCII more predictably.
After unescaping, the tool says whether what came out is valid JSON or plain text. That distinction matters when you are debugging: if the result is not valid JSON, the escaping was still removed correctly, and what was inside was either plain text or JSON that was already broken before anything escaped it. Knowing which one it is tells you where to look next.
The counts underneath show how many escape sequences were involved, broken down by quotes, backslashes, newlines and unicode escapes. On the escape side it also shows how many bytes the escaping added.
If your JSON is fine and you only want it smaller or more readable, use the JSON Minifier instead – that is a different job. If you are working inside a language rather than a browser, JSON.parse and JSON.stringify, Python’s json.loads, or jq -r do this in one line and belong in your code, not in a tab. And if what you have is not escaping at all but URL encoding – %22 rather than \" – the URL Encoder and Decoder is the right page.
Everything here runs in your browser. Tokens, webhook bodies and customer payloads are never uploaded, which matters for exactly the kind of content that ends up escaped in a log in the first place.
Last reviewed August 2026 · this tool runs on-device.
Paste the escaped string and press Convert. Every layer of escaping is removed in one pass, and the chain above the result shows how many there were.
It turns a JSON document into a single string value, escaping the quotes, backslashes and line breaks inside it so the whole thing can live in one field.
Each service that stores a payload as a string escapes it again. A webhook body logged by a queue and then an aggregator can arrive escaped two or three times.
Those backslashes are escape characters, not stray text. Unescaping removes them correctly, where a find-and-replace would corrupt any backslash that was genuinely part of the data.
Yes. Copying from a log usually loses the outer quotes. This tool adds them back and parses anyway, instead of returning an error.
It is processed in your browser and never sent anywhere. Load the page, disconnect from the network, and it still works.
It turns accented and non-Latin characters into \u sequences. JSON does not require it, but some older parsers and drivers handle pure ASCII more predictably.
Probably nothing here. The escaping was removed correctly; what was inside was plain text, or JSON that was already broken before it was escaped.
Minify JSON, beautify it back, and see the real compressed size. Flags duplicate keys your parser silently drops.
Encode or decode URLs and query values — Component, Full URL or Form mode, single or batch. Decodes recursively, breaks a URL into its parameters, and runs entirely in your browser.