JSON : 슬래시가 이스케이프 처리되는 이유는 무엇입니까?


369

이것의 이유는 나를 "탈출"시킨다.

JSON 은 슬래시를 이스케이프하므로 해시 {a: "a/b/c"}{"a":"a\/b\/c"}대신에 직렬화됩니다 {"a":"a/b/c"}.

왜?


4
FWIW 내가 슬래시가 JSON에서 탈출 본 적이 없어, 난 그냥에서 자바 라이브러리를 발견 code.google.com/p/json-simple
제이슨 S를

24
PHP의는 json_encode()기본적으로 슬래시를 탈출하지만,이 JSON_UNESCAPED_SLASHESPHP 5.4.0 (2012 월)부터 옵션
월터 Tross

6
모든 슬래시를 피할 수있는 PHP 코드는 다음과 같습니다 '</'.echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
rustyx

코드에 '</'가 포함되어 있습니까? 아니면 에코에서 시작됩니까? 에코에서 시작하는 것이 실패하기 때문입니다. 나는 아무것도 얻지 못한다. 예, 변수에 $ obj를
바꿨습니다

JSON은 아무것도 이스케이프하거나 직렬화하지 않습니다 ... JSON 직렬 변환기는 그렇지 않습니다. 어느 것을 사용하고 있습니까?
궤도에서 가벼움 경주

답변:


284

JSON은 그렇게 할 필요가 없으며 그렇게 할 수 있습니다. 또한 "A"에 "\ u0061"을 사용할 수 있지만 필수는 아닙니다. 태그에 \/JSON을 임베드 할 때 도움을 허용 하면 Seb가 지적한 것처럼 문자열 내부를 <script>허용하지 않습니다 </.

Microsoft의 ASP.NET Ajax / JSON API 중 일부는이 허점을 사용하여 추가 정보를 추가합니다. 예를 들어 날짜 시간은로 전송됩니다 "\/Date(milliseconds)\/". (왝)


4
</a> 탈출하는 것이 좋습니다. 어쨌든 JSON은 종종 스크립트 태그에 포함되지 않습니다.
Ruben

8
은 ASP.NET JSON 날짜 형식에 대한 근거에 대해이 블로그 게시물을 참조 : weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
미키 엘 반 Oosterhout의에게

25
JSON 시리얼 라이저의 특정 구현은 일부 JSON을 출력하기 때문에 JSON을 대체해야합니다 ( 전적으로 유효한 JSON ). 누군가가 그에게 물 날개 세트를 샀기 때문에 아기를 버리는 것처럼 목욕물로 아기를 버리는 것은 그리 많지 않습니다.
Quentin

15
내가 얻지 못하는 것은 JSON 직렬 변환기가 JSON이 끝나는 위치를 걱정하는 이유입니다. 웹 페이지, HTTP 요청 등 무엇이든. 필요한 경우 최종 렌더러가 추가 인코딩을 수행하도록합니다.
Dan Ross

5
@ DanRoss 그리고 그것은 할 수 있습니다. 이스케이프는 /되지 필요 가있다, 허용 JSON의 사용을 쉽게하기 위해. 탈출 /하고 싶지 않다면하지 마십시오.
Andreas

35

JSON 사양에 따르면 슬래시를 피할 수는 있지만 반드시 그럴 필요는 없습니다.


9
해당 특정 섹션에 대한 링크를 추가 할 수 있습니까?
Ryan Gates

1
사양은 그렇게 말하지 않습니다. 사실 그것은 당신이 고상한 성격을 피해야한다는 것입니다. 참조 ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
조아 에버트

10
@JoaEbert : 역 고 상선을 이스케이프해야하지만, 고 상선을 이탈 할 필요는 없습니다. 섹션 9에는 "이스케이프해야하는 문자를 제외하고 모든 문자를 따옴표 안에 넣을 수 있습니다 : 따옴표 (U + 0022), 역 솔리드 (U + 005C) 및 제어 문자 U + 0000 ~ U + 001F. "
Harold L

4
고마워 해롤드! "...을 제외한 모든 코드 포인트"는 /가 선택 사항임을 명확하게 나타내므로 그림 5에도 나와 있습니다.
Joa Ebert

15

나는 얼마 전에 같은 질문 을했고 스스로 대답해야했습니다. 내가 생각해 낸 것은 다음과 같습니다.

내 생각 JavaScript 루트 에서 나온 것이라고 생각한 것 같습니다 .

'\/' === '/'JavaScript에서 JSON 유효한 JavaScript입니다. 그러나 왜 다른 무시 된 이스케이프 (예 :) \z가 JSON에서 허용되지 않습니까?

이것의 열쇠는 http://www.cs.tut.fi/~jkorpela/www/revsol.html 을 읽은 다음 http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2 . 슬래시 이스케이프 기능을 사용하면 JSON을 HTML (SGML) 및 XML에 임베드 할 수 있습니다.


5
구조화 된 데이터 페이로드 전달 메커니즘은 언어 구성과 관련되어서는 안됩니다. 이것은 나중에 변경 될 수 있지만 JSON 제작자가있는 경우 디자인 결정을 설명 할 수 있습니다.

'\ /'=== '/'그래서 jsonp을받을 때 슬래시를 이스케이프 처리 할 필요가 없습니까?
Timmetje

8

PHP는 기본적으로 슬래시를 이스케이프 처리 하므로 이것이 일반적으로 나타나는 이유 일 수 있습니다. 왜 그런지 잘 모르겠지만 태그 "</script>"안에 문자열을 삽입하는 <script>것이 안전하지 않은 것으로 간주 되기 때문일 수 있습니다 .

이 기능은 JSON_UNESCAPED_SLASHES플래그 를 전달하여 비활성화 할 수 있지만 원래 결과는 이미 유효한 JSON이므로 대부분의 개발자는 이 기능을 사용하지 않습니다.


5

못생긴 PHP!

JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES해야합니다 기본이 아닌 (이상한) 옵션은 ... 어떻게 PHP 개발자들에 대답?

기본값은 가장 빈번한 사용, 그리고 UTF8로 (현재) 가장 널리 사용되는 표준해야합니다. Github 또는 다른 곳에서 몇 개의 PHP 코드 조각이이 HTML을 포함하는 기능을 필요로합니까?


2
맞아요! 그러나 PHP는 미래에 모든 이상한 오류를 조장하여 해충처럼 전 세계에 퍼져있는 손상된 역사적인 PHP 스 니펫의 모든 이전 버그를 깨뜨리지 않습니다. 따라서 PHP가 취한 모든 잘못된 결정은 PHP에 대한 거의 모든 결정이 표준이됩니다. 표준이 변경 될 것으로 기대할 수 없으므로 모든 단일 PHP 개발자는 PHP에서 발견 된 모든 심각한 버그에 대해 무한한 수의 해결 방법을 모두 알고 구현해야합니다. stackoverflow ..
Tino

당신은 완전히 틀 렸습니다. JavaScript 때문입니다. 아래 지적한 바와 같이. JS에서는 '\/' === '/'true를 반환합니다. 나는 사실에 충실하도록 조언합니다. 대부분의 사람들은 일관되지 않은 함수 이름에 대처할 수 있습니다. 과거를 볼 수 없기 때문에 PHP를 나쁜 도구로 만들지 않습니다.
코볼트

1
안녕하세요 @Cobolt, 그것은 오늘 PHP를 사용하지 않는 오래된 질문입니다 ... 그러나 토론 블로그로서 핵심은 "기본적으로 가장 자주 사용되어야합니다" 이므로 못생긴 것은이 "가장 자주 사용되는"을 무시하는 것입니다 Javascript의 (추악한) 동작.
피터 크라우스

1
이곳은 특정 언어에 대해 묻지 않습니다. 현재 PHP가하는 일과 비활성화하는 방법을 지적하면 더 도움이되었으며 이제는 그렇게하는 대답이 추가되었습니다 .
IMSoP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.