2012-10-07 4 views
4

좋아, PHP 5.3 서버에서 손으로 만든 JSON (5.3에서 json_encode 함수에 JSON_UNESCAPE_UNICODE이 없기 때문에)을 처리하고 있고 this thread을 읽고 몇 가지 테스트를 한 후에 다음과 같은 문제를 발견했습니다. jQuery의 parseJSON 기능.왜 jQuery.parseJSON은 개행을 허용하지 않습니까?

한다고 가정 나는 다음과 같은 JSON가 : 당신이 jsonlint.com를 사용하여 선택하면

{ 
    "hello": "hi\nlittle boy?" 
} 

은 당신이 올바른 JSON입니다 볼 수 있습니다. 그러나 다음을 시도하면 오류 메시지가 표시됩니다.

$(function(){ 
    try{ 
     $.parseJSON('{ "hello": "hi\nlittle boy?" }'); 
    } catch (exception) { 
     alert(exception.message); 
    }  
});​ 

Link to the fiddle.

jQuery에서 bug report을 열었습니다. 올바른 버그라고 생각하기 때문입니다. 어떻게 생각해?

답변

12

이것은 버그가 아니며 JavaScript에서 문자열 리터럴을 처리하는 방법과 관련이 있습니다. 당신이있을 때 :

{ "hello": "hi 
little boy?" } 

... 전에 parseJSON()에 전달됩니다

'{ "hello": "hi\nlittle boy?" }' 

은 ... 당신의 문자열에 구문 분석 얻을 것이다. \n이 "안녕 소년"의 한가운데에서 문자 그대로의 개행 문자로 변환 되었기 때문에 분명히 유효한 JSON이 아닙니다. 끈.

리터럴 뉴 라인으로 변환되기 전에 '\n'시퀀스를 parseJSON() 함수로 바꾸기를 원합니다. 그런 일이 일어나려면 두 번 리터럴 문자열에서 이스케이프해야합니다. 마찬가지로 :

'{ "hello": "hi\\nlittle boy?" }' 

예 : http://jsfiddle.net/m8t89/2/

+0

음 나는 그것이 비록 버그없는 정말 모르겠어요. 자바 스크립트에서 문자열 리터럴을 처리하는 방법에도 불구하고, jQuery는 문자가 개행 문자인지 확인해야합니다. http://jsfiddle.net/UTVcW/ –

+0

@JoseTomasTocino - 가능합니다. . 하지만 JSON 구문 분석기는 리터럴 "제어 문자"(예 : '캐리지 리턴'및 '라인 피드')를 해당 정의에서 명시 적으로 제외하는 [JSON 사양] (http://www.json.org/)을 따르지 않습니다. 유효한 문자열. 그래서 이것이 버그라면 jQuery (또는 다른 사람의 것) 구현의 버그가 아니라 스펙의 버그입니다. – aroth

+0

글쎄, JSON 사양에서 [문자열 시퀀스] (http://www.json.org/string.gif)는 "\ n"문자를 받아 들일 것으로 보인다. (사실 그것은 두 개의 문자가 될 것이다. jQuery의 파서에 예외를 추가하는 것이 현명 할 것입니다. 그래서 하나의 문자 "\ n"이 있다면, 그것들을 2-chracter "\ n"에 연결하고 들어오는 문자열을 받아들입니다. 달리 행동하면 해로울 수있는 경우는 생각할 수 없습니다. –

관련 문제