JSON을 문자열 리터럴로 이스케이프하기 (그리고 이중 인코드된 JSON 디코드)

JSON을 stringify하면 내부 따옴표와 특수 문자가 이스케이프된 채 큰따옴표로 감싸져, 다른 곳에 안전하게 내장할 수 있는 JSON 문자열 리터럴이 됩니다.

「리터럴로 stringify한다」는 무슨 뜻인가

JSON 문자열을 JSON.stringify에 통과시키면 큰따옴표로 감싸지고 내부의 따옴표와 백슬래시가 이스케이프되어, 어디든 안전하게 끼워 넣을 수 있는 하나의 문자열 값이 나옵니다.

왜 필요한가

JSON을 다른 JSON 필드 안에 끼워 넣거나, 문자열 유형 DB 컬럼에 저장하거나, 환경 변수나 URL 파라미터로 넘기려면 이스케이프된 문자열 리터럴이 필요합니다.

이스케이프 규칙

큰따옴표는 백슬래시로 이스케이프, 백슬래시는 두 개로, 줄바꿈・탭 같은 제어 문자는 두 글자 이스케이프 시퀀스가 됩니다. 결과에는 가공되지 않은 줄바꿈이 없습니다.

이중 인코딩된 JSON 디코딩

이스케이프된 따옴표로 시작하고 그 시퀀스를 포함하는 문자열을 받았다면, 그것은 stringify된 것입니다. 한 번 파싱해서 내부 JSON 문자열을 얻고, 다시 한 번 파싱해 실제 값을 얻으세요.

이중 인코딩이 등장하는 곳

컨텍스트 객체를 직렬화하는 로깅 프레임워크, JSON 본문을 'body' 필드 안에 감싸는 웹훅, JSON-as-string 봉투를 보내는 메시지 큐, text나 varchar 형 DB 컬럼이 가장 흔한 출처입니다. 시작의 따옴표와 짝수 개의 백슬래시가 신호입니다.

로그 속 임베드된 JSON 다루기

구조화 로거는 객체를 stringify해서 각 로그 라인을 단일 값으로 만들곤 합니다. 내용을 보려면 라인을 로그 뷰어에서 꺼내, JSON.parse로 이스케이프를 풀고, 회복한 JSON을 포매팅하세요. 여러 줄의 JSON 객체를 grep하는 것은 피하고 — 한 줄로 stringify된 JSON이 훨씬 검색하기 좋습니다.

왕복용 도구

브라우저 콘솔: JSON.parse(line)으로 내부 JSON을 얻고 JSON.stringify(...,null,2)로 예쁘게 출력. Node CLI: 'node -e "console.log(JSON.parse(process.argv[1]))" "<line>"'이 두 단계를 한 번에 처리. 이 사이트의 JSON Stringify 도구는 임의 깊이의 중첩을 한 번의 클릭으로 처리합니다.