2013-09-10 4 views
1

모든,내가 GET 매개 변수로 캐릭터 라인 JSON 객체를 전달하기 위해 노력하고있어

는 GET 매개 변수를 json_decode 수 없습니다 만 수신 URL 그것을 해독 할 수없는 것 같다. 여기

는 관련 코드 :

클라이언트 측 JSON 객체 제작 (잘 작동) :

function createJson(){ 
// This works fine. It creates a json objects with three elements, the third being an array. 
//(omitted code for brevity) 
    return jsonData; 
} 

클라이언트 측 AJAX 호출이 (잘 작동) :

function recordSetGet(jsonData){ 
    request = createRequest(); 
    var rawSet=JSON.stringify(jsonData); 
    var encodedSet=encodeURIComponent(rawSet); 
    var params="set="+encodedSet; 
    var url= "Ajax_recordSetGet.php?"+params; 
    request.open("GET", url, true); 
    request.onreadystatechange = function(){} 
    request.send(null); 
} 

이쪽을 산출 다음 URL : Ajax_recordSetGet.php?set=%7B%22setTitle%22%3A%22test%22%2C%22setTags%22%3A%22test%20%22%2C%22set%22%3A%5B%7B%22first%22%3A%22Joe%22%2C%22last%22%3A%22Doe%22%2C%22checked%22%3Atrue%7D%5D%7D"

서버 측 치료 :

<?php 
header('Content-Type:text/html; charset=UTF-8'); 
if(!session_id()){ 
    session_start(); 
} 
if(isset($_GET['set'])){ 
    $set=$_GET['set'];//This is the URI encoded string 
    var_dump ($set); 
    var_dump (json_decode($set)); 
    var_dump ("Json last error is ".json_last_error()); 
} 
?> 

이 var_dumps의 결과는 다음과 같습니다 string '{"setTitle":"test","setTags":"test ","set":[{"first":"Joe","last":"Doe","checked":true}]}"' (length=90)
null
string 'Json last error is 4' (length=20)

는 왜 여기에 실패 json_decode()입니까? json_last_error() 결과에 구문 오류가 있음을 나타냅니다. 나는 PARAM 문자열을 빌드하는 경우이처럼 인코딩없이
:

편집 : '비 인코딩 된 문자열을 보내는 경우 그 json_decode를 참고하는 것도 실패

var rawSet=JSON.stringify(jsonData); 
var params="set="+rawSet; 
var url= "Ajax_recordSetGet.php?"+params; 

그런 다음 URL은 Ajax_recordSetGet.php?set={"setTitle":"test","setTags":"test ","set":[{"first":"Joe","last":"Doe","checked":true}]}"

된다

수신 URL var_dump에서 동일한 오류가 발생합니다.
string '{"setTitle":"test","setTags":"test ","set":[{"first":"Joe","last":"Doe","checked":true}]}"' (length=90)
nullstring 'Json last error is 4' (length=20)

+0

[The SSCCE] (http://sscce.org/)에 대해 알아보십시오. –

+1

** TL; DR **. 질문을보다 간결하게하십시오. 우리가 더 필요하면 우리는 물어볼 것입니다. –

+0

그것은 내가 읽지 않은 많은 코드입니다. –

답변

1

나는 이유는 모르겠지만, 당신은 JSON 디코딩 과정을 망쳐 놨 당신의 URL에 후행 따옴표가있다.

...%7D%5D%7D" <- Trailing double quote 

이 인용은 설정 변수의 덤프에 표시 : 나는 그렇게해야 자리를 볼 수 있지만

...true}]}"' (length=90) <- double quote is inside the string, the single quote is part of the var_dump output. 

이 따옴표는 자바 스크립트 코드에 도입해야합니다. 하지만 디버깅은 시스템의 해당 부분에서 이루어져야합니다.

"set"매개 변수로 전달 된 문자열을 PHP가 이미 해독 한 것처럼 urldecode해서는 안됩니다. 그러나 큰 따옴표 뒤에는 json_decode()으로 전화 할 수 없습니다.

간단한 개념 증명으로 PHP 코드에서 $set = rtrim($set, '"')을 사용하여 해독 한 후 해당 인용 문자를 제거하십시오.

+0

첫 번째 큰 따옴표 바로 앞에 백 슬래시가 있습니다. –

+0

정확히 어디입니까? – Sven

+0

URL 끝 부분에 아무 것도 안되는 따옴표가 있습니다. 수동으로 제거하면 json_decode가 올바르게 작동합니다. – JDelage

1

http://php.net/manual/en/function.urldecode.php

The superglobals $_GET and $_REQUEST are already decoded. Using urldecode() on an element in $_GET or $_REQUEST could have unexpected and dangerous results.

은 다른 방법을 사용해보십시오. json 문자열을 base64 인코딩하는 것이 좋습니다. 대신이의

:

var rawSet=JSON.stringify(jsonData); 
var encodedSet=btoa(rawSet); 
var params="set="+encodedSet; 
var url= "Ajax_recordSetGet.php?"+params; 

을하지만 caveats에주의 :

var rawSet=JSON.stringify(jsonData); 
var encodedSet=encodeURIComponent(rawSet); 
var params="set="+encodedSet; 
var url= "Ajax_recordSetGet.php?"+params; 

는 이렇게!

그리고 당신의 서버 측에서

:

$decodedSet=json_decode(base64_decode($set)); 
+0

왜? 또한 원시'$ _GET' 매개 변수와 디코드 된 버전 모두에서'json_decode'를 시도합니다. 둘 다 일하지 않아. – JDelage

+0

이것은 PHP의 일반적인 불만입니다. PHP는 바로 그런 방식으로 구현했습니다. 나는 그것을 좋아하지 않지만 말벌 둥지입니다. –

+0

php가 urlencoded get 매개 변수를 mangling하고 있습니다. 그 주위에 방법이 없습니다. 따라서 다른 인코딩 메커니즘을 사용하십시오. 그게 내 대답의 핵심이야. –

관련 문제