php 기호 - json_encode가 백 슬래시를 추가하는 이유는 무엇입니까?



백슬래시 치는법 (6)

나는 json_encode 를 오랫동안 사용 해왔고 지금까지 아무런 문제가 없었다. 이제 업로드 스크립트로 작업 중이며 파일 업로드 후 JSON 데이터를 반환하려고합니다.

다음 코드가 있습니다.

print_r($result); // <-- This is an associative array
echo json_encode($result); // <-- this returns valid JSON

이 결과는 다음과 같습니다.

// print_r result
Array
(
    [logo_url] => http://mysite.com/uploads/gallery/7f/3b/f65ab8165d_logo.jpeg
    [img_id] => 54
    [feedback] => Array
        (
            [message] => File uploaded
            [success] => 1
        )

)

// Echo result
{"logo_url":"http:\/\/mysite.com\/uploads\/gallery\/7f\/3b\/f65ab8165d_logo.jpeg","img_id":"54","feedback":{"message":"File uploaded","success":true}}

json_encode 가 왜 슬래시를 추가하는지 누가 알 수 있습니까?

최신 정보

@Quentin은 json_encode.parseJSON 사이에 뭔가가 일어나고 있다고 말했습니다.

alert(data.toSource()); 다음 결과를 제공합니다.

({response:"{\"logo_url\":\"http:\\/\\/storelocator.com\\/wp-content\\/uploads\\/gallery\\/7f\\/3b\\/71b9520cfc91a90afbdbbfc9d2b2239b_logo.jpeg\",\"img_id\":\"62\",\"feedback\":{\"message\":\"File uploaded\",\"success\":true}}", status:200})

그리고 이것은 유효한 JSON이 아닙니다. 그것은 또한 status:200 추가합니다 status:200 그리고 나는 이것이 어디에서 비롯되는지 전혀 모른다.

Plupload bind 가 반환 된 데이터에 무언가를 수행 할 수 있습니까?

이것은 내 js 스크립트입니다.

  uploader.bind('FileUploaded', function(up, file, data) {
    alert(data.toSource());
    $('#' + file.id + " b").html("100%");
  });

Answers

json_encode가 왜 슬래시를 추가하는지 누가 알 수 있습니까?

슬래시 문자는 HTML 스크립트 요소에 임베드 될 때 <script element의 끝>에 대한 SGML 규칙을 트리거 할 때 < 앞에 붙이면 문제가 발생할 수 있습니다. 그들은 예방 차원에서 탈출했다.

왜냐하면 내가 jQuery.parseJSON (응답)을 사용하려고 시도하기 때문에; 내 js 스크립트에서 null을 반환합니다. 내 추측으로는 슬래시와 관련이 있습니다.

그렇지 않습니다. JSON에서 "/""\/" 는 동일합니다.

질문에 나열한 JSON이 유효합니다 ( jsonlint 테스트 할 수 있습니다). 문제는 json_encodeparseJSON 간에 일어나는 parseJSON 있습니다.


방금 일부 스크립트에서이 문제를 보았습니다. json 인코딩 된 다른 배열 안에 json_encode를 배열에 적용했기 때문에 문제가 발생했습니다. 스크립트에서 데이터를 생성하는 foreach 루프가 여러 개있는 경우 쉽게 수행 할 수 있습니다. 항상 json_encode를 끝에 적용하십시오.

여기 무슨 일이 일어 났는지입니다. 당신이하는 일 :

$data[] = json_encode(['test' => 'one', 'test' => '2']);
$data[] = json_encode(['test' => 'two', 'test' => 'four']);
echo json_encode($data);

결과는 다음과 같습니다.

["{\"test\":\"2\"}","{\"test\":\"four\"}"]

따라서 실제로해야 할 일은 다음과 같습니다.

$data[] = ['test' => 'one', 'test' => '2'];
$data[] = ['test' => 'two', 'test' => 'four'];
echo json_encode($data);

그리고 이것은 돌아올 것입니다.

[{"test":"2"},{"test":"four"}]

"JSON_UNESCAPED_SLASHES"옵션 (버전 5.4 이후에 추가됨)을 사용하십시오.

json_encode($array,JSON_UNESCAPED_SLASHES);

이것은 JSON 형식에서 ""(인용 부호)를 사용하고 이러한 인용 부호 사이에있는 모든 것이 유용한 정보 (키 또는 데이터)이기 때문에 발생합니다.

귀하의 데이터가 있다고 가정 해보십시오. He said "This is how it is done". 그런 다음 실제 데이터는 "He said \"This is how it is done\"." .

이렇게하면 \" JSON 형식이 아닌 "(Quotation mark) 로 처리됩니다. 이를 escape character 라고 escape character .

이는 대개 이미 JSON으로 인코딩 된 데이터를 인코딩하려고 할 때 발생합니다. 이는 일반적으로 발생하는 것으로 보입니다.

이 시도

$arr = ['This is a sample','This is also a "sample"']; echo json_encode($arr);

산출:

["This is a sample","This is also a \"sample\""]

json_encode 는 항상 슬래시를 추가합니다.

설명서의 예를 HERE 에서 확인하십시오.

이스케이프해야하는 문자가 있으면 문제가 발생하기 때문입니다.

json을 사용하려면 json을 구문 분석하여 슬래시가 제거되었는지 확인하십시오.

음, 당신이 slashesthe json을 제거할지 여부는 eval에 의해 아무 문제없이 파싱됩니다.

<?php
$array = array('url'=>'http://mysite.com/uploads/gallery/7f/3b/f65ab8165d_logo.jpeg','id'=>54);
?>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
var x = jQuery.parseJSON('<?php echo json_encode($array);?>');
alert(x);
</script>

이것은 내 코드이며 JSON을 구문 분석 할 수 있습니다.

코드 확인 JSON을 구문 분석하는 동안 뭔가 빠졌을 수 있습니다.


나는 솔직함에서 영감을 얻었고 링크가있을 때 모든 페이지에 포함 된 "settings.php"파일에 다음과 같은 내용을 추가했습니다.

"settings.php"

    $folder_depth = substr_count($_SERVER["PHP_SELF"] , "/");

     $slash="";

    for ($i=1;$i<=($folder_depth-2);++$i){

        $slash= $slash."../";

    }

내 header.php에 모든 페이지에 포함됨 :

a href = .... php echo $ slash.'index.php '....

로컬 및 호스트 환경에서 모두 작동하는 것 같습니다 ....

(참고 : 나는 절대 초보자이다)





php json