문제

이스케이프 처리된 경우에도 큰따옴표로 인해 구문 분석 오류가 발생합니다.
아래 코드를 보세요

//parse the json in javascript  
var testJson = '{"result": ["lunch", "\"Show\""] }';  
var tags = JSON.parse(testJson);  
alert (tags.result[1]);

큰따옴표(이미 이스케이프됨)로 인해 구문 분석 오류가 발생합니다.
심지어 eval() 여기서는 작동하지 않습니다.
하지만 다음과 같이 이중 슬래시를 사용하여 이스케이프 처리하면 다음과 같습니다.

var result = '{"result": ["lunch", "\\"Show\\""] }';  
var tags = JSON.parse(result);  
alert (tags.result[1]);

그러면 잘 작동합니다.
자바스크립트에서 이중 슬래시를 사용해야 하는 이유는 무엇입니까?문제는 PHP이다. json_encode() 함수는 단일 슬래시로 큰따옴표를 이스케이프합니다(예: \"show\") 어느 JSON.parse 구문 분석할 수 없습니다.이 상황을 어떻게 처리해야 하나요?

도움이 되었습니까?

해결책

마지막으로, JSON의 구문 분석은 동일한 평가를 사용하므로 SMTH를 줄 때는 차이가 없습니다. 잘못된 구문. 이 경우 PHP에서 인용문을 올바르게 탈출 한 다음 json_encode로 탈출하고 탈출해야합니다.

<?php
    $json = '{"result": ["lunch", "\"Show\""] }';
    echo json_encode($json);
?>

OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }"

이것은 클라이언트 측 JS에서 작동해야합니다 (오타가없는 경우).

다른 팁

Javascript는 문자열을 이스케이프 해제하고 json도 문자열을 이스케이프 해제합니다.첫 번째 문자열( '{"result": ["lunch", "\"Show\""] }' )는 json 파서에서 다음과 같이 표시됩니다.{"result": ["lunch", ""Show""] }, 왜냐하면 \" 자바스크립트 수단으로 ", 그러나 큰따옴표로 묶인 문자열을 종료하지 않습니다.

두 번째 문자열 '{"result": ["lunch", "\\\"Show\\\""] }' 먼저 이스케이프되지 않습니다. {"result": ["lunch", "\"Show\""] } (그리고 그것은 json에 의해 올바르게 이스케이프 해제됩니다).

내 생각에는 '{"result": ["lunch", "\\"Show\\""] }' 작동해야합니다.

이 문제는 두 가지 폴드 스트링 탈출 메커니즘으로 인해 발생합니다. 하나는 JS에서 나온 것입니다. 하나는 JSON에서 나옵니다.

다른 다음 문자와 결합 된 백 슬래시 문자의 조합은 하나의 캐릭터 그것은 문자열 내에서 표현할 수 없습니다. '' ''는 ''등을 나타냅니다.

이 탈출 메커니즘은 json.parse ()가 작동하기 전에 이루어집니다.

예를 들어,

var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}');
console.log(parsedObj.sentence);
>>>"It is one backslash(\)"

문자열 생성기의 관점에서 4 개의 백래시를 통과합니다 ''JavaScript 해석가에.

JavaScript 해석가의 관점에서, 그것은 inteprets입니다 백래시가 두 개 있습니다() 각 ''시퀀스는 하나의 ''로 해석됩니다.

JSON 파서의 관점에서 두 개의 백래시를받습니다() 및 JSON 문자열 탈출 규칙은 출력 결과 인 단일 ''로 구문 분석됩니다.

첫 번째 코드 설명 :

var testJson = '{"result": ["lunch", "\"Show\""] }';
//The real string after sequence escaping in to JS is
//'{"result": ["lunch", ""Show""] }' 
//which is passed into the JSON.parse.
//Thus, it breaks the JSON grammar and generates an error
var tags = JSON.parse(testJson);  
alert (tags.result[1]);

로부터 문서

JSON_HEX_APOS (Integer) All '는 u0027로 변환됩니다.
JSON_HEX_QUOT (정수) 모두 " u0022로 변환됩니다.

json_encode ()는 값과 옵션 인 두 개의 Args를 취합니다. 그래서 시도하십시오

json_encode($result, JSON_HEX_QUOT); // or
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS);

나는 이것을 시도하지 않았다.

끄다 magic_quotes_gpc 안에 php.ini.

PHP에서 JavaScript 객체 (php> = 5.3.0)

var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');

표준 C 탈출이 추가되면 JSON.parse 같은 시퀀스를 변환합니다 \" ~ 안으로 ", \\ ~ 안으로 \, \n 라인 피드 등으로

'foo\\bar\nbaz"' === JSON.parse('"foo\\\\bar\\nbaz\\""')

프로젝트의 경우 :

원래 문자열 ""{\"lat\":28.4594965,\"lng\":77.0266383}""

지나간 후 JSON.parse()

"{"lat":28.4594965,"lng":77.0266383}"

2nd 전달 JSON.parse()

{lat: 28.4594965, lng: 77.0266383}

그것을주의해라 JSON.parse() 변환하는 대신 탈출 문자를 제거했습니다 string 에게 object.

탈출 캐릭터가 제거 된 후, 문자열 대 객체 변환이 작동했습니다.

데모는 다음과 같습니다.

while (typeof p1 != 'object') {
  p1 = JSON.parse(p1);
  pass++;
  console.log('On pass ', pass, p1);
}

도움이 될 수 있습니다 :

<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top