본문으로 건너뛰기
jsonbeautifiers
한국어

JSON 언이스케이프

몇 겹으로 감싸여 있든 이스케이프된 문자열에서 읽을 수 있는 JSON을 되찾습니다.

이스케이프됨
디코딩 결과

붙여 넣은 것은 여러분의 브라우저를 떠나지 않습니다. connect-src 허용 목록 덕분에 이는 약속이 아니라 브라우저가 강제하는 보장입니다. 직접 확인하기

이스케이프된 JSON 문자열에서 원래 텍스트를 되찾습니다. 감싸는 따옴표가 있으면 벗겨 내고, 이스케이프 시퀀스를 디코딩하며, \uXXXX는 그것이 가리키는 문자가 됩니다.

값이 몇 겹으로 인코딩되었는지도 셉니다. JSON.stringify가 두 번 걸린 페이로드는 흔한 API 버그이면서 읽을 수도 없기 때문입니다.

이중 인코딩과 알아보는 법

직렬화되어 텍스트 필드에 담겼다가 다시 직렬화된 값은 백슬래시 범벅으로 도착합니다. 세 번째로 직렬화되면 또 두 배가 됩니다.

이 도구는 층수를 감지하고 전부 벗겨 낼지 물어봅니다. 흔한 원인은 페이로드를 텍스트로 저장해 두고 디코딩하지 않은 채 JSON 봉투에 담아 돌려주는 서비스, 또는 이미 문자열화된 것에 stringify를 또 부르는 클라이언트입니다.

추측하지 않고 보고하는 것

잘못된 이스케이프 시퀀스는 조용한 결정이 아니라 경고입니다. \x41은 유효한 JSON이 아니고, 그걸 슬그머니 A로 바꾸는 도구는 문서에 없는 의미를 지어내는 셈입니다. 위치와 설명을 알려 주고, 나머지 텍스트가 살아남도록 백슬래시만 버립니다.

디코딩 결과 자체가 유효한 JSON이면 그것도 알려 줍니다. 다 벗겨 냈는지 가장 빨리 확인하는 방법입니다.

How to do this in code

코드에서의 언이스케이프.

js JavaScript
// If the value includes its quotes, parse it as a JSON string
const text = JSON.parse('"line one\\nline two"');

// Peel every layer of encoding
function fullyDecode(value) {
  let out = value;
  for (let i = 0; i < 8 && typeof out === 'string'; i++) {
    try { out = JSON.parse(out); } catch { break; }
  }
  return out;
}
py Python

unicode_escape는 사람들이 가장 먼저 찾는 답이고, ASCII가 아닌 것에 대해서는 틀린 답입니다.

import json

text = json.loads('"line one\\nline two"')

# Standard library, without the surrounding quotes
text = bytes(raw, 'utf-8').decode('unicode_escape')
# Note: unicode_escape assumes Latin-1 for bytes above 127,
# so it mangles non-ASCII. json.loads is the correct route.
sh jq

fromjson은 정확히 이중 인코딩 상황을 위한 jq 내장 함수입니다.

# Decode a JSON string to raw text
jq -r . <<< '"line one\nline two"'

# Peel a doubly encoded field
jq -r '.payload | fromjson' response.json

자주 묻는 질문

출력에 아직도 백슬래시가 남아 있는 이유는?
한 번보다 많이 인코딩되어 있었기 때문입니다. "모든 계층 해제"를 켜거나, 개수가 0이 될 때까지 자기 출력에 도구를 다시 돌리세요.
결과가 유효한 JSON이라는 건 무슨 뜻인가요?
그 문자열이 평범한 텍스트가 아니라 JSON 문서를 담고 있었다는 뜻입니다. 그게 이중 인코딩 상황이고, 도구가 그렇다고 분명히 말해 줍니다.