programing

jQuery.parseJSON이 JSON에서 이스케이프된 단일 따옴표로 인해 "Invalid JSON" 오류를 발생시킵니다.

prostudy 2022. 10. 13. 23:23
반응형

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 웹사이트의 스테이트 머신 다이어그램에 따르면 이스케이프된 이중 따옴표만 허용되며 단일 따옴표는 허용되지 않습니다.작은따옴표는 이스케이프할 필요가 없습니다.

http://www.json.org/string.gif


업데이트 - 관심 있는 사용자를 위한 자세한 정보:


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 로직의 기반이 되는 라이브러리가 있습니다).JSONjQuery는 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 코드와 함께&#39;stringify() 메서드 뒤에 regex를 사용하여 다음 방법으로 호출합니다.

var productToString = JSON.stringify(productObject);
var quoteReplaced = productToString.replace(/'/g, "&#39;");
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

반응형