2012-07-05 5 views
-1

나는 다음과 같은 JSON 문자열은 노드 JS 서비스에서 돌아 오는이 : 그래서PHP에서 JSON을 구문 분석하는 올바른 방법은 무엇입니까?

string '{"success":true,"isavailable":true}' (length=35) 

:

"{\"success\":true,\"isavailable\":true}" 

은 내가이 (가) 위해서 var_dump에서 다음을 얻을 PHP에서 json_decode()를 사용하려고 할 때 나는이 작업을 수행 할 때

$str = str_replace("\"{", "'{", $str); 
$str = str_replace("}\"", "}'", $str); 
$str = str_replace('\"','"',$str); 

내가 돌아에서 구문 오류 마지막 오류 및 NULL의 값을 얻을 : 나는 다음을 수행하려고 설정합니다.

그래서 PHP에서이 JSON 문자열을 구문 분석하는 올바른 방법은 무엇입니까?

+2

'json_decode'가 작동합니다 : http://codepad.org/LIBC8ihP –

+0

'json_decode'는 PHP 5.2.0 이상에서만 사용할 수 있습니까? – AlexLittlejohn

+0

@AlexLittlejohn 5.2.0보다 오래된 버전을 사용하는 이유는 무엇입니까? – Lusitanian

답변

1

올바른 해결책은 stripslashes()을 호출 한 후 선도 없애 trim() 큰 따옴표를 후행를 사용하는 것입니다

object(stdClass)#1 (2) { ["success"]=> bool(true) ["isavailable"]=> bool(true) } 

나는이 문자열은 이중 인코딩 것으로 보인다, 그래서도 제대로 디코딩 할 수 있음을 확인했습니다

$str = '"{\"success\":true,\"isavailable\":true}"'; 
var_dump(json_decode(json_decode($str))); 
+0

json_decode (stripslashes ($ json_string)); 나는 충분히 추측한다. 보이는 이중 따옴표는 실제로 JSON 문자열의 일부가 아닙니다. – Neo

+0

@ 네오 -'trim()'이 없으면 실제로 문자열에서 큰 따옴표를 두 번 사용하기 때문에 [나를 위해 실패합니다] (http://viper-7.com/w7y0v8) – nickb

+0

입니다. 실제 문자열에는 두 번 포함되지 않습니다. – Neo

0

$parsed = json_decode($whatever);

+0

왜 downvote? 그것은 첫 번째 대답이었고 정확했습니다. – Joe

+0

나는 똑같은 것을 궁금해하고 있었다. – Lusitanian

+4

@Joe : 아마도 Todd가'json_decode'를 시도했지만, 객체가 아닌 문자열이 될 가능성이 높다. – outis

0

사용

json_decode(stripslashes($json_string)); 
+1

이것을 사용하면 NULL이됩니다. –

+0

$ a = '{\ "success \": true, \ "isavailable \": true}'; var_dump (json_decode (stripslashes ($ a))); 올바른 개체를 제공합니다. – Neo

1
$obj = json_decode("{\"success\":true,\"isavailable\":true}"); 
echo $obj->success; 
echo $obj->isavailable; 

결과 : 여기 1

11 

true (당신의 JSON의 실제 값)을 나타내는 예 truthy 값.

working example에서 데모를 볼 수 있습니다. ,

$str = '"{\"success\":true,\"isavailable\":true}"'; 
$str = trim(stripslashes($str), '"'); 
var_dump(json_decode($str)); 

이제 you get : (영업에 정확히입니다 입력을 가정)

+1

비 객체의 속성을 얻으려고 시도합니다. 오류 –

+1

@ToddMoses : 아니요, 여기의 작업 예제를 참조하십시오. http://codepad.org/kGxUNabC – Blaster

0

귀하의 입력이 가정 잘못되었습니다

$this = '"{\"success\":true,\"isavailable\":true}"'; 

은 당신이 정말로 무엇을 것입니다.

사실 json_decode 문제가 아니라 슬래시와 후행 따옴표입니다.

위에서 언급 한 것처럼 교체하거나 트리밍하여 문제를 해결할 수 있습니다.

$obj = json_decode(trim(stripslashes('"{\"success\":true,\"isavailable\":true}\"'), '"')); 

은 어떻게 그것을 ACESS하려면 : 1로 진정한거야

$obj->success 

$obj->isavailable 

은 부울입니다.

하지만 개인적으로 JSON 문자열에 대한 이러한 '해킹'을 피하려면 응답을 회피해야합니다. 슬래시와 따옴표로 된 것은 이스케이프 처리되지 않아야합니다.

물론 JSON 응답 일 수도 있습니다.

관련 문제