What this tool does
A JSON string literal becomes the text it represents. "caf\u00e9" gives café, "line\nbreak" gives two lines, and "\ud83d\ude00" gives the emoji — a surrogate pair is one character, not two broken halves.
The quotes are optional
Both of these work:
"caf\u00e9"
caf\u00e9
That is deliberate. A JSON string rarely arrives with its quotes intact: you copy it out of a log line, a git diff, a stack trace, an error message that quoted only the inside. Demanding the quotes would mean adding them back by hand every time.
The cost is a small one, stated plainly: a bare input that happens to be valid JSON of another kind — [1,2], null — is read as text, because that is what a bare fragment means here. Only a quoted input is parsed as a literal.
A refusal says what and where
An input that is not a JSON string is refused rather than half-decoded, and the message names the cause:
| Input | Message |
|---|---|
a"b | Unescaped quotation mark at position 1: write it as \" |
"ab\q" | Unknown escape "\q" at position 3 |
"a\u12" | Invalid \u escape at position 2: four hexadecimal digits expected |
"abc | The opening quotation mark has no closing quotation mark |
{"a":1} | Expected a JSON string, found a JSON object |
Positions count from zero and refer to the text you pasted, so the number takes you to the character.
This is worth stating because it used to be otherwise: every one of these cases produced the single message Invalid JSON string escape sequence. A pasted object is not an escaping mistake, and being told it is sends you looking in the wrong place. That was a real defect in this tool, found while writing this page and fixed.
Nothing is guessed
An unknown escape is an error, not a character. \q is not valid JSON, and deciding it “probably meant q” would hand you text that is subtly different from what the source held — the kind of difference that surfaces three systems later.
Private by design
Everything runs locally in your browser with JavaScript. Your data is never uploaded, which makes the tool safe for sensitive content, and it keeps working offline.