큰따옴표가 포함된 json 구문 분석 오류
-
09-09-2019 - |
문제
이스케이프 처리된 경우에도 큰따옴표로 인해 구문 분석 오류가 발생합니다.
아래 코드를 보세요
//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));