이 도구를 만들게 만든 버그는 미친 듯이 작았습니다. 저는 HTML 이메일 템플릿을 - 따옴표,줄 바꿈,홀수 백슬래시가 있는 몇 백 줄 - JSON 필드에 채워서 API 로 보내려고 했는데 요청이 계속 400 으로 돌아왔습니다. 템플릿은 괜찮았습니다. JSON 은 그 자체로 괜찮았습니다. 하지만 두 사람이 만나는 순간,탈출되지 않은 3 백 자짜리 큰따옴표가 문자열을 조용히 일찍 닫았고,파서가 이해할 수 없는 쓰레기로 변한 이후의 모든 유효한 텍스트를 유효한 컨테이너에 붙여넣고 유효하지 않은 문서를 생성했습니다.
그것이 JSON 탈출이 해결하는 전체 문제이며,주변에서 작업하기보다는 이해할 가치가 있습니다. 이 가이드는 탈출이 실제로하는 일,어떤 캐릭터를 탈출해야하는지,왜 탈출하지 않으면 어떻게 반전되는지,무료를 사용하는 방법을 다룹니다 JSON 탈출 / 이탈 단일 자동 오류 없이 JSON 문자열에서 임의의 텍스트를 들어오고 나가는 도구입니다. 이는 내가 작성한 다른 데이터 유틸리티와 나란히 있습니다 JSON 도구에 대한 궁극적 인 가이드.
TL;DR: JSON 문자열은 원시 큰따옴표, 원시 백슬래시 또는 개행 부호 및 탭과 같은 원시 제어 문자를 포함할 수 없습니다. 이스케이프 처리에서는 각각을 백슬래시 시퀀스로 대체합니다. -
"된다\"가 되며, 개행\n는, 탭이 됩니다\t그리고 U+0020 아래의 다른 모든 것은 다음과 같습니다\uXXXX. Unescaping 은 그 시퀀스를 다시 원래 문자로 바꿉니다. The JSON 탈출 / 이탈 도구는 결과를 따옴표로 묶고 ASCII가 아닌 다른 이름으로 이스케이프하는 옵션과 함께 브라우저에서 두 가지 작업을 모두 수행합니다\uXXXX또는 앞으로 슬래시를 탈출하세요.
JSON에 대한 문자열을 이스케이프한다는 것은 무엇을 의미합니까?
JSON은 정확하고 출판된 문법을 가지고 있습니다. 이는 다음과 같이 정의됩니다 RFC 8259 그리고 ECMA-404 표준에 의해 - 그리고 문자열 내부에 나타날 수있는 것에 대한 규칙은 엄격합니다. JSON 문자열은 큰 따옴표로 감싸 인 문자의 실행입니다. 큰 따옴표는 문자열의 시작과 끝,큰 따옴표를 표시하기 때문에 내부 텍스트는 조기에 종료됩니다. 백슬래시가 이스케이프 시퀀스를 시작하기 때문에 원시 백슬래시는 하나의 시작으로 잘못 읽혀집니다. 그리고 JSON 문자열은 텍스트의 단일 논리적 줄로 의미되기 때문에 문자 그대로의 제어 문자 - 개행,탭, 캐리지 리턴 - 는 이스케이프되지 않은 상태로 그 안에 앉을 수 없습니다.
이스케이프하는 것은 그 골치 아픈 문자들을 각각 JSON 이 이해하는 두 문자의 백슬래시 시퀀스로 바꾸는 과정입니다. 큰따옴표가 됩니다 \". 백슬래시가 됩니다 \\. 개행 문자가 됩니다 \n. 결과는 텍스트 that 보인다 조금 더 추악하지만 이제 주변 문서를 깨지 않고 두 인용 부호 사이에 놓아도 안전합니다. 의미는 동일합니다 - JSON 파서 읽기 \n 다시 실제 개행 문자를 생성하지만 이제 표현이 합법적입니다.
이것은 JSON 문서를 포맷하는 것과는 근본적으로 다릅니다. 포맷터는 전체 객체의 구조를 배열합니다: 들여쓰기,키 순서,요소 사이의 공백. 이스케이프는 한 단계 아래로,위에 작동합니다 단일 문자열 값의 내용. 당신은에 도달 JSON 포맷터 예쁜 인쇄나 검증을 위한 전체 문서가 있는 경우 JSON 탈출 / 이탈 도구 원시 텍스트 덩어리가 있으면 한 필드 안에 넣어야 합니다.
실제로 탈출이 필요한 캐릭터는 누구인가요?
JSON 사양은 여기서 신선하게 구체적입니다. 문자열 안에는 정확히 두 개의 문자가 있습니다 반드시 항상 이스케이프되고 전체 범위의 제어 문자가 추가됩니다.
두 가지 필수 단일 문자 이스케이프는 큰따옴표(Double Quot)입니다\") 및 백슬래시(\\). 그 외에도 JSON 은 5 개의 공통 제어 문자에 대한 짧은 이스케이프를 정의합니다: 백스페이스 (backspace,)\b), 피드(\f), 개행(\n), 캐리지 리턴(\r) 및 수평 탭(\t). 어느 다른 제어 문자 - 짧은 형식이 없는 U+0020 미만의 코드 포인트가 있는 모든 것은 a로 작성해야 합니다 \u 이스케이프 뒤에 16진수 4자리가 오므로 널 바이트가 됩니다 \u0000 그리고 "단위 구분 기호"가 됩니다 \u001F.
두 명의 캐릭터가 더 있습니다 선택사항 탈출하려면 혼란이 스며드는 곳입니다. 앞으로 슬래시는 다음과 같이 쓸 수 있습니다 \/, 하지만 꼭 그럴 필요는 없습니다. 평원입니다 / 는 완벽하게 유효한 JSON 입니다. 그리고 악센트처럼 ASCII 범위 위의 모든 문자는 é 또는 이모티콘은 문자 그대로 UTF-8 문서에 작성되거나 이스케이프될 수 있습니다 \uXXXX; 둘 다 합법적입니다. 그만큼 JSON 탈출 / 이탈 도구는 항상 필수 이스케이프를 처리하고 두 가지 선택적 이스케이프에 대한 토글을 제공하므로 대상 시스템이 기대하는 모든 것을 일치시킬 수 있습니다.
슬래시 및 ASCII가 아닌 문자를 앞으로 벗어날까요?
이 두 가지 선택적 이스케이프는 거의 필요하지 않더라도 실제 이유로 존재합니다.
앞으로 슬래시 이스케이프는 정확히 하나의 일반적인 상황에서 중요합니다: JSON이 HTML 내부에 내장되어 있을 때 <script> 태그. the browser's HTML 파서는 리터럴 시퀀스를 찾습니다 </ 스크립트 블록의 끝을 찾으려면 문자열이 포함됩니다 </script> JSON 에서 태그를 조기에 닫고 페이지를 깰 수 있습니다. 슬래시를 다음과 같이 쓰기 <\/script> - 여전히 유효한 JSON,한 번 구문 분석된 동일한 문자열은 이를 방지합니다. 인라인 스크립트 외부에서는 슬래시를 그대로 둘 수 있으므로 도구는 기본적으로 슬래시를 이스케이프되지 않은 상태로 둡니다.
ASCII가 아닌 문자를 이스케이프합니다 \uXXXX 정확성보다는 이식성에 관한 것입니다. JSON 이 UTF-8 바이트를 망가 뜨리는 시스템 - 오래된 로깅 파이프 라인,잘못 구성된 프록시,ASCII 를 가정하는 채널 - 을 통과 할 수 있다면 ASCII 범위 위의 모든 문자를 순수 ASCII 로 전환하십시오 \u 탈출은 그대로 살아남을 것을 보장합니다. 출력은 부피가 크고 사람이 읽을 수 없기 때문에 기본적으로 꺼져 있지만 "Escape Unicode" 토글은 방탄 수송이 필요한 순간 거기에 있습니다. 와 같은 코드 포인트 é 된다 \u00e9그리고 JSON 파서는 나가는 길에 원래 캐릭터를 재구성합니다.
탈출하지 않는 방법은 무엇이며, 언제 필요합니까?
탈출은 정확한 역입니다: 탈출 한 문자열을 통해 걸어가서 각 백 슬래시 시퀀스를 다시 나타내는 원시 문자로 바꿉니다. \n 진짜 개행이 되고, \t 탭이 되고, \" 는 큰따옴표가 되고, 그리고 \uXXXX 해당 코드 포인트의 문자가 됩니다. 수신 측에 있을 때마다 필요합니다. JSON 파일,로그 라인 또는 API 응답에서 문자열 값을 바로 복사했으며 화면이 가득한 백슬래시 없이 원본 텍스트를 읽고 싶습니다.
좋은 unescaper 는 순진한 찾기 및 바꾸기가하지 않는 두 가지 작업을 수행합니다. 첫째,전체 값이 인용되면 주변의 큰 따옴표 한 쌍을 제거하므로 붙여 넣을 수 있습니다 "line one\nline two" JSON 문서에서 바로 깨끗한 텍스트를 다시 가져옵니다. 둘째, 그것 검증하다 진행됨에 따라: 다음과 같은 유효하지 않은 이스케이프 시퀀스 \x또는 문자열 맨 끝에 있는 길 잃은 백슬래시는 실제 오류입니다 JSON 탈출 / 이탈 도구는 추측하고 조용히 잘못된 출력을 생성하는 대신 위치를 보고합니다. 위치 14" 에서 명확한 "invalid escape 를 얻는 것; 거의 옳아 보이지만 미묘하게 손상된 텍스트를 얻는 것을 이깁니다.
신뢰해야 할 핵심 속성은 이스케이프 및 이스케이프 해제가 정확한 역이라는 것입니다. 모든 텍스트를 이스케이프 한 다음 결과를 이스케이프 해제로 시작한 것을 문자별로 정확하게 되돌릴 수 있습니다. 그 왕복 보장은 도구를 파이프 라인의 일상적인 단계로 사용하는 것이 안전하다는 것입니다. 위험한 변환보다는 손으로 다시 확인해야합니다.
이스케이프 대 관련 문자열 작업
JSON 탈출은 "make this text safe for that context" 변환, 그리고 그것은 그들을 똑바로 유지 하는 데 도움이 됩니다. 다음은 이웃 개발자와 가장 자주 혼동 하는 방법에 비교 하는 방법입니다.
| 운영 | 에 대하여 보호합니다 | 예 | 도구 |
|---|---|---|---|
| JSON 탈출 | 따옴표, 백슬래시 또는 제어 문자로 JSON 문자열을 끊습니다 | he said "hi" → he said \"hi\" |
JSON 탈출 / 이탈 |
| HTML 엔터티 인코딩 | HTML을 깨거나 XSS를 활성화합니다 <, >, & |
<b> → <b> |
HTML 엔터티 |
| URL 퍼센트 인코딩 | 공백이나 예약된 문자로 URL을 해독합니다 | a b → a%20b |
- |
| JSON 형식/검증 | 전체 문서의 구조적 오류 | 축소 → 예쁜 인쇄 | JSON 포맷터 |
| JSON → 얌 | 직렬화 형식 간에 구성을 이동합니다 | {"a":1} → a: 1 |
JSON에서 YAML로 |
주목해야 할 패턴은 각 탈출이 a를 목표로 한다는 것입니다 다른 컨테이너. HTML 엔티티는 HTML 을 깨는 텍스트 유지; 퍼센트 인코딩은 URL 을 깨는 것을 유지; JSON 이스케이프 JSON 문자열을 깨는 것을 유지. 잘못된 하나를 사용하여 - HTML 인코딩 JSON 이스케이프가 필요한 무언가 - 실제 문제를 해결하지 않은 상태로두고 노이즈의 새로운 레이어를 추가합니다. 이 모든 것은 타사 서버에 건네주고 싶지 않을 수도 텍스트에서 실행되기 때문에,나는 이러한 도구 클라이언트 측의 모든 하나를 유지,이는 내가 만든 인수 전체 온라인 도구에 대한 데이터 개인 정보 보호 가이드.
JSON에 텍스트를 삽입할 때 흔히 저지르는 실수는 무엇입니까?
가장 흔한 실수는 오후에 비용을 들인 실수입니다: 이스케이프되지 않은 인용문이 있는 여러 줄의 텍스트를 JSON 필드에 직접 붙여넣고 두 부분이 모두 유효하기 때문에 전체가 유효하다고 가정하는 것은 아닙니다 - 컨테이너에는 내용이 준수해야 하는 규칙이 있습니다.
가까운 초는 이중 탈출. 문자열이 이미 한 번 이스케이프되고 다시 이스케이프된 경우,모든 \n 된다 \\n 그리고 당신의 개행은 어떤 파서도 다시 변환하지 않는 리터럴 백슬래시-n 으로 바뀝니다. 이것은 보통 값이 각각 도움이 되는 방법으로 빠져나가는 두 시스템을 통과할 때 발생합니다. 만약 당신의 출력이 의심스러운 실행을 가진다면 \\ 단일 백슬래시를 예상했던 곳에서는 아마도 이중 탈출이 있을 것이며 한 번 탈출하지 않으면 문제가 해결될 것입니다. 세 번째 함정은 다음과 같은 Windows 경로를 잊어버리는 것입니다 C:\Users\me 백슬래시로 가득 차 있으며, 각각은 백슬래시가 되어야 합니다 \\ - JSON에서 탈출하지 못한 경로는 "why is my JSON invalid"의 고전적인 소스입니다. 혼란.
세 가지 모두에 대한 수정 사항은 동일합니다: 원시 텍스트가 JSON을 만나는 경계에서 도구가 정확히 한 번 이스케이프를 수행하고, 무언가 변경되었는지 온전하게 확인하기 위해 표시되는 문자 수 요약을 읽도록 합니다. 직접 확인해야 할 경우 "wrap in quotes"로 이스케이프하고 결과를 붙여넣습니다 JSON 포맷터 - 유효한 문자열로 구문 분석되면 이스케이프가 정확합니다.
실제 예: JSON에 HTML 조각을 삽입합니다
이것을 시작한 정확한 상황을 살펴보겠습니다. 왜냐하면 변환을 한 번 보면 규칙이 달라붙기 때문입니다. 이 조각을 the로 보내고 싶다고 가정해 보겠습니다 body API 요청 필드:
<p>Hi "there",</p>
<p>Visit https://example.com/path</p>
그 텍스트의 세 가지가 JSON 과 싸울 것입니다. 주위에 두 개의 큰 따옴표 there 각각 문자열을 끝내려고 합니다. 단락 사이의 개행은 문자열 내부에서 JSON 이 금지하는 리터럴 제어 문자입니다. 그리고 the </p> 일반 JSON 파일에서는 시퀀스가 무해하지만 이 JSON이 HTML 내부에 인쇄되면 위험합니다 <script> 꼬리표. 조각에 붙여 넣기 JSON 탈출 / 이탈 도구, "wrap in quotes, "을 켜면 유효한 단일 JSON 문자열이 나타납니다: 따옴표가 됩니다 \"는, 개행이 된다 \n그리고 "앞으로 슬래시" 탈출; 닫는 태그가 활성화되었습니다 <\/p>. 인용된 전체 값을 바로 귀하의 값에 넣으십시오 body 필드 및 요청이 진행됩니다.
역방향 여행도 마찬가지로 일상적입니다. 팀원이 JSON-escaped 로 로그 라인을 보낼 때 message 필드가 가득합니다 \n 그리고 \"을 붙여넣고 도구에 붙여넣고 Unescape 로 전환한 후 백슬래시가 사라진 원본 멀티라인 텍스트를 읽습니다. 두 작업이 정확히 역전되기 때문에 페이로드를 이동하여 편집하고 손상에 대한 두려움 없이 다시 들어갈 수 있습니다. 문자 수 요약은 변환이 실행되었음을 확인하고 잘못된 이스케이프는 텍스트를 조용히 망치는 대신 해당 위치로 표시됩니다. 왕복 안전은 긴장된 수동 단계에서 벗어나 워크플로로 연결하고 잊어버릴 수 있는 것으로 바꾸는 것입니다.
자주 묻는 질문
JSON에 대한 문자열을 이스케이프한다는 것은 무엇을 의미합니까? JSON 문자열 값은 원시 큰따옴표, 원시 백슬래시 또는 개행 문자 및 탭과 같은 원시 제어 문자를 포함할 수 없습니다. 이스케이프 처리에서는 이들 각각을 백슬래시 시퀀스로 대체합니다. - " "가 되고, 개행은\n이 되고, 탭은\t가 됩니다. - 따라서 주변 구조를 깨지 않고 텍스트를 JSON 문자열 내부에 배치할 수 있습니다.
JSON 포맷터와 어떻게 다른가요? JSON 포맷터는 전체 JSON 문서를 예쁘게 인쇄하거나 축소하고 구조를 검증합니다. 이 도구는 단일 문자열의 내용에 대해 한 단계 아래로 작동합니다. 임의 텍스트를 JSON 값에 포함하는 것을 안전하게 만들거나 이스케이프된 값을 원시 텍스트로 다시 디코딩합니다. 문서에는 포맷터를 사용하고 개별 문자열에는 이 도구를 사용합니다.
어떤 캐릭터가 탈출합니까? 큰따옴표 ("), 백슬래시 (\), 백스페이스 (\b), 폼 피드 (\f), 개행 (\n), 캐리지 리턴 (\r), 탭 (\t) 은 항상 이스케이프되며,U+0020 아래의 다른 컨트롤 문자는\uXXXX 가 됩니다. 선택적으로,앞쪽 슬래시는/가 되고 모든 비 ASCII 문자는\uXXXX 가 됩니다.
앞으로 슬래시를 피해야합니까? 선택 사항입니다. JSON spec 은/와/를 모두 허용하므로,plain /는 유효합니다. one place / matters 는 HTML 내부에 있습니다



