Tools · nested data

Unstringify JSON

The reverse of stringify. A string that holds another document opens where it sits, as structure; Pack puts the exact bytes back.

no signup · runs entirely in your browser · ⌘V works anywhere on this page
See it done · 8 s
Unstringify a packed value — An SNS notification: the tree, then Unpack on the Tools row opens the JSON packed inside Message, in place — the text is rewritten and undo puts the string back. · 8 s

What you get

  • Opens the 2 packed values in the SNS sample in place — the Message body, and the attribute value inside it
  • Opens the SQS sample 3 levels deep in one click — the body, the SNS envelope inside it, the event inside that — each named by the parser that opened it
  • Shows Unpack on every string value that parses as JSON, XML or YAML — a finding about your data, not a mode you switch on
  • Repeats until nothing inside parses, up to 8 levels — a document inside a string inside a document
  • Pack restores the original bytes rather than re-serializing from the tree
  • Over records — a Kibana export, an NDJSON log — a packed cell opens in the panel as nested rows, and the cell stays the string the file wrote

What it will not do

  • Decode base64, URL-encoding or gzip. A value has to be text that parses.
  • Change a cell in a CSV or a log row. Over records the panel opens the value; the source stays as written.
  • Guess. A value that does not parse as JSON, XML or YAML stays the string it is.
  • Send your text anywhere. The page is static and the engine runs in this tab — open the network panel and watch it stay empty.

What unescaping does

\" becomes "
"{\"a\":1}"{"a":1}
\\ becomes \
"C:\\temp"C:\temp
\u00e9 becomes é
"caf\u00e9"café
A string that holds a document opens in place
{"m": "{\"a\":1}"}{"m": { "a": 1 }}
Twice-encoded

A string inside a string inside the document opens level by level; Pack in the app puts every byte back.

The sample

What the first sample opens — a real file, not an illustration written for this page.

sns-notification.json
{
  "Type": "Notification",
  "MessageId": "8f3aa19c-4d21-4e6b-9c02-fe13a1d04b7e",
  "TopicArn": "arn:aws:sns:eu-west-1:123456789012:checkout-events",
  "Message": "{\"event\":\"stripe.charge.completed\",\"order_id\":\"ord_8f3aa19c4d\",\"amount\":17054,\"currency\":\"usd\",\"customer\":{\"id\":\"cus_4129\",\"email\":\"rin.aoyama@oboro.studio\"}}",
  "Timestamp": "2026-04-21T14:32:08.412Z",
  "MessageAttributes": {
    "payload": { "Type": "String", "Value": "{\"retries\":2,\"source\":\"webhook\"}" }
…

in VS Code

A hover on a packed value shows what it holds; Unpack this value opens it in place, and undo packs it back. Unpack all — the file, or the workspace — is Pro.

unstringify for VS Code14-day trial · Free and Pro

Questions

What is stringified JSON?

JSON written into a string field of another document: every quote escaped as \", every newline as \n. It happens whenever a system stores a payload as text — SNS and SQS envelopes, a log’s message field, a JSON column in a relational database.

How is this different from a JSON unescape tool?

An unescape tool takes the string and hands you the text. Here the string stays in its document: the envelope and the payload read as one tree, and Pack writes the string back where it was.

Does it work on double-encoded JSON?

Yes. Unpack runs again on what it opened until nothing inside parses, up to 8 levels deep.

Can it open XML or YAML inside a field?

Yes — the row names the format it found, and it opens the same way.

Try it on the file that broke your afternoon.

free · no signup