jQuery.parseJSON이 JSON에서 이스케이프된 단일 따옴표로 인해 "Invalid JSON" 오류를 발생시킵니다.
가 지금 것은 음음음음음 i i i i i i i i i i i i i i i 。jQuery.post()
오브젝트(예: JSON 오브젝트)를.{ "var": "value", ... }
값에 단일 따옴표가 되어 있는 (「」와 같이 됩니다\'
jQuery는 유효한 JSON 문자열을 해석할 수 없습니다.다음은 (Chrome의 콘솔에서 실행)의 예입니다.
data = "{ \"status\": \"success\", \"newHtml\": \"Hello \\\'x\" }";
eval("x = " + data); // { newHtml: "Hello 'x", status: "success" }
$.parseJSON(data); // Invalid JSON: { "status": "success", "newHtml": "Hello \'x" }
이게 정상이야?JSON을 통해 하나의 견적을 제대로 전달할 수 있는 방법은 없습니까?
JSON 웹사이트의 스테이트 머신 다이어그램에 따르면 이스케이프된 이중 따옴표만 허용되며 단일 따옴표는 허용되지 않습니다.작은따옴표는 이스케이프할 필요가 없습니다.
업데이트 - 관심 있는 사용자를 위한 자세한 정보:
Douglas Crockford는 JSON 사양이 문자열 내에서 이스케이프된 단일 따옴표를 허용하지 않는 이유를 구체적으로 밝히지 않았습니다.단, JavaScript 부록E의 JSON에 대한 설명 중: "좋은 부분"은 다음과 같습니다.
JSON의 설계 목표는 최소, 휴대용, 텍스트 및 JavaScript의 하위 집합이었습니다.상호 운용을 위해 합의할 필요가 적을수록 상호 운용이 쉬워집니다.
따라서 모든 JSON 구현이 동의해야 하는 규칙이 하나 적기 때문에 이중 따옴표를 사용하여 문자열만 정의할 수 있습니다.그 결과 문자열 내의 단일 따옴표 문자는 실수로 문자열을 종료할 수 없습니다.정의상 문자열은 이중 따옴표로 끝나기 때문입니다.따라서 정식 사양에서는 단일 따옴표 문자를 이스케이프할 필요가 없습니다.
Digging a little bit deeper, Crockford's org.json implementation of JSON for Java is more permissible and 한다 allow single quote characters:
toString 메서드에 의해 생성되는 텍스트는 JSON 구문 규칙에 엄밀하게 준거합니다.컨스트럭터들은 수용하는 텍스트에 대해 더 관대합니다.
...
- 문자열은 '(단일 따옴표)로 따옴표로 묶을 수 있습니다.
이것은 JSONTokener 소스 코드를 통해 확인됩니다.그nextString
단일 합니다.
public String nextString(char quote) throws JSONException {
char c;
StringBuffer sb = new StringBuffer();
for (;;) {
c = next();
switch (c) {
...
case '\\':
c = this.next();
switch (c) {
...
case '"':
case '\'':
case '\\':
case '/':
sb.append(c);
break;
...
이 메서드의 맨 위에는 다음과 같은 유용한 코멘트가 있습니다.
정식 JSON 형식에서는 작은 따옴표 안에 문자열을 넣을 수 없지만 구현에서는 문자열을 받아들일 수 있습니다.
따라서 일부 구현에서는 단일 인용문을 사용할 수 있지만, 이 인용문에 의존해서는 안 됩니다.널리 사용되는 대부분의 구현은 이 점에서 상당히 제한적이며 단일 따옴표로 묶인 문자열 및/또는 이스케이프된 단일 따옴표를 포함하는 JSON을 거부합니다.
마지막으로 이 문제를 원래 질문으로 되돌리기 위해 먼저 브라우저의 네이티브 JSON 파서 또는 json2.js와 같은 로드된 라이브러리를 사용합니다(옆으로 보면 jQuery 로직의 기반이 되는 라이브러리가 있습니다).JSON
의jQuery는 jQuery를 사용합니다.
parseJSON: function( data ) {
...
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
...
jQuery.error( "Invalid JSON: " + data );
},
이러한 구현은 공식 JSON 사양에만 준거하고 단일 따옴표는 받지 않으므로 jQuery도 마찬가지인 것으로 알고 있습니다.
되지 않으므로 \'따옴표를 합니다.\u0027
자세한 것은, http://www.utf8-chartable.de/ 를 참조해 주세요.
편집: 댓글에서 backticks라는 단어를 잘못 사용한 것을 양해 바랍니다.내 말은 백슬래시였어.여기서 요점은 다른 문자열 안에 중첩된 문자열이 있는 경우 단일 따옴표를 피하기 위해 백슬래시를 많이 사용하는 대신 유니코드를 사용하는 것이 더 유용하고 읽을 수 있다는 것입니다.만약 당신이 중첩되지 않았다면, 그냥 평범한 옛 인용문을 넣는 것이 정말로 더 쉽다.
문제가 어디에 있는지 이해하고 스펙을 보면 이스케이프되지 않은 작은 따옴표를 올바르게 해석해야 한다는 것을 알 수 있습니다.
jquery의 jQuery.parseJ를 사용하고 있습니다.SON 함수는 JSON 문자열을 해석하지만 json_encode로 준비된 데이터에 단일 따옴표가 있는 경우 해석 오류가 발생합니다.
실장중에, 다음과 같은 실수가 있는 것은 아닐까요(PHP - 서버측).
$data = array();
$elem = array();
$elem['name'] = 'Erik';
$elem['position'] = 'PHP Programmer';
$data[] = json_encode($elem);
$elem = array();
$elem['name'] = 'Carl';
$elem['position'] = 'C Programmer';
$data[] = json_encode($elem);
$jsonString = "[" . implode(", ", $data) . "]";
마지막 단계는 JSON 인코딩된 문자열을 JS 변수에 저장하는 것입니다.
<script type="text/javascript">
employees = jQuery.parseJSON('<?=$marker; ?>');
</script>
" 가 아닌 " " 를 사용해도 오류가 발생합니다.
해결책:
비트마스크 JSON_HEX_APOS를 사용하여 다음과 같은 작은 따옴표를 변환한 것이 유일한 효과입니다.
json_encode($tmp, JSON_HEX_APOS);
이 문제를 해결할 다른 방법이 있나요?코드가 잘못되었거나 제대로 작성되지 않았습니까?
감사해요.
쿼리에서 단일 인용문을 보내는 경우
empid = " T'via"
empid =escape(empid)
단일 견적서를 포함한 가치를 얻을 수 있는 경우
var xxx = request.QueryString("empid")
xxx= unscape(xxx)
쿼리에 단일 따옴표를 포함하는 값을 검색/삽입하려면xxx=Replace(empid,"'","''")
Cake를 사용하여 유사한 문제 해결PHP가 PHP 네이티브를 사용하여 JavaScript 스크립트 블록을 출력합니다.json_encode
.$contractorCompanies
에는 작은 따옴표가 있고 위와 같이 예상된 값이 포함되어 있습니다.json_encode($contractorCompanies)
유효한 JSON이기 때문에 피해가지 않습니다.
<?php $this->Html->scriptBlock("var contractorCompanies = jQuery.parseJSON( '".(json_encode($contractorCompanies)."' );"); ?>
JSON 인코딩된 문자열 주위에 addslash()를 추가하면 따옴표를 피할 수 있습니다.그러면 Cake/PHP는 올바른 Javascript를 브라우저에 에코할 수 있습니다.JS 에러가 사라집니다.
<?php $this->Html->scriptBlock("var contractorCompanies = jQuery.parseJSON( '".addslashes(json_encode($contractorCompanies))."' );"); ?>
XHR 요청의 JSON 개체를 HTML5 data-* 속성에 저장하려고 했습니다.나는 위의 많은 해결책을 시도했지만 성공하지 못했다.
결국 제가 한 일은 하나의 인용문을 대체하는 것이었습니다.'
IT 코드와 함께'
stringify() 메서드 뒤에 regex를 사용하여 다음 방법으로 호출합니다.
var productToString = JSON.stringify(productObject);
var quoteReplaced = productToString.replace(/'/g, "'");
var anchor = '<a data-product=\'' + quoteReplaced + '\' href=\'#\'>' + productObject.name + '</a>';
// Here you can use the "anchor" variable to update your DOM element.
재밌는.서버 측에서는 어떻게 JSON을 생성합니까?라이브러리 기능을 사용하고 있습니까(예:json_encode
또는 JSON 스트링을 수동으로 작성합니까?
내 관심을 끄는 건 탈옥 아포스트로피야\'
큰따옴표를 사용하고 있는 것을 보면, 당연히 작은따옴표를 피할 필요가 없습니다.저는 아직 버전 1.4.1로 업데이트하지 않았기 때문에 그것이 당신의 jQuery 오류의 원인인지 확인할 수 없습니다.
언급URL : https://stackoverflow.com/questions/2275359/jquery-parsejson-throws-invalid-json-error-due-to-escaped-single-quote-in-json
'programing' 카테고리의 다른 글
GitHub에서 Python 패키지를 설치하는 방법은? (0) | 2022.10.13 |
---|---|
Redux 스토어 상태를 리셋하는 방법 (0) | 2022.10.13 |
리스트 내의 고유값 발생을 카운트하려면 어떻게 해야 합니까? (0) | 2022.10.03 |
MySQLdb를 사용하여 커서를 닫아야 하는 경우 (0) | 2022.10.03 |
Larabel Migration을 사용하여 타임스탬프 열의 기본값을 현재 타임스탬프로 설정하려면 어떻게 해야 합니까? (0) | 2022.10.03 |