2012-12-19 2 views
7

변수 문자열을 NULL 반환json_decode이 코드와 함께, 내가 json_decode에 정말 이상한 문제를 만난

$url="http://localhost:8983/solr/db/select?wt=json&rows=1&q=94305"; 
$string=file_get_contents($url); 
echo $string; echo '<br><br>'; 
$json=json_decode($string); 
var_dump($json); 

나는 다음과 같은 결과를 얻었다 :

{"responseHeader":{"status":0,"QTime":0,"params":{"q":"94305","wt":"json","rows":"1"}},"response":{"numFound":165,"start":0,"docs":[{"price":"","tags":"ATMs","phone_n":"","location":"37.42409897,-122.1709976 ","store":"Discover ATM","store_id":"478602","state":"CA","latitude":"37.42409897","address":"459 LAGUNITA","zipcode_n":"94305","longitude":"-122.1709976\r","url":"Discover_ATM_459_LAGUNITA_Stanford_CA_94305","city":"Stanford","category":"ATMs","text":["","CA","459 LAGUNITA","94305","Stanford"],"spell":["Discover ATM"]}]}} 

NULL 

내가이 json_decode 수 없다는 것을 끈. 내가 이렇게 할 때, (위의 문자열의 출력을 복사 직접 $ 문자열에 넣어) :

$string='{"responseHeader":{"status":0,"QTime":0,"params":{"q":"94305","wt":"json","rows":"1"}},"response":{"numFound":165,"start":0,"docs":[{"price":"","tags":"ATMs","phone_n":"","location":"37.42409897,-122.1709976 ","store":"Discover ATM","store_id":"478602","state":"CA","latitude":"37.42409897","address":"459 LAGUNITA","zipcode_n":"94305","longitude":"-122.1709976\r","url":"Discover_ATM_459_LAGUNITA_Stanford_CA_94305","city":"Stanford","category":"ATMs","text":["","CA","459 LAGUNITA","94305","Stanford"],"spell":["Discover ATM"]}]}}'; 
$json=json_decode($string); 
var_dump($json); 

json_decode 작동합니다. 왜 json_decode가 제대로 작동하는 동안 첫 번째 부분에서 NULL을 얻는가?

+3

문자열에 BOM (Byte Order Mark)이 있는지 확인하십시오. –

+0

아마도 응답에 끝에 개행 문자가 포함되어있을 가능성이 있습니까? –

+0

'echo $ string' 대신'print_r ($ string)'을 시도하십시오 –

답변

4

귀하의 코드를 좋아 보이는 JSON 데이터를 구문 분석에서 발생, 그래서 한 걸음 더 가까이 걸릴 $output 정말 무엇인지 조사 할 경우. 볼 수없는 ASCII 범위를 처리 할 수있는 표현을 선택하는 데 도움이됩니다.

거대한 문자열을 제공하지만 대부분 문자열 앞뒤에 관심이 있습니다.

즉 정결 보인다면, 당신이 만들 수있는 중간 표현 : 그것은 그들을 발견하기가 다소 더 쉽게 16 진수 표현과 낮거나 높은 ASCII 범위의 모든 문자를 대체

echo preg_replace('@[\x00-\x1f\x7f-\xff]@e', '" (0x" . dechex(ord("\\0")) . ") "', $output); 

:) \r - - 어딘가에 중간에

업데이트 위의에 따라 조사에서

, 당신의 문자열은 캐리지 리턴을 포함 할 것 고르다.

"CA","latitude":"37.42409897"," 
          ^

다른 방법으로 해결할 수없는 경우 preg_replace() 인 사람은 제거 할 수 있습니다. 어떤 \r을 제거

preg_replace("/\r(?!\n)/", '', $output); 

\n 하였다 없음.

+0

중간에 약간의 차이가 있습니다. 370d222c vs 3720222c – user570494

+1

@ user570494 중간에 캐리지 리턴이있는 이유는 확실치 않지만 문제가 될 수 있습니다 ... 나는 해킹 된 솔루션으로 내 대답을 업데이트했습니다. solr이 왜 당신에게 그 결과를주는지를 아는 것이 더 좋습니다. –

+0

'preg_replace ("/ \ r (?! \ n) /", '', $ output);'작동합니다! 정말 고맙습니다! – user570494

3

문자열의 일부 NULL 바이트가있을 수 있습니다

이 페이지에 JSON으로

$string = trim($string, "\x0"); 
$json=json_decode($string); 
var_dump($json); 

변경에게 콘텐츠 형식을 사용하여 제거 http://localhost:8983/solr/db/select?wt=json&rows=1&q=94305

header('Content-type:application/json; charset=utf-8'); 

BOM (바이트 순서 표시를 제거)

if (substr($string, 0,3) == pack("CCC",0xef,0xbb,0xbf)) { 
$string = substr($string, 3); 
} 

점검 오류가

$json_errors = array(
     JSON_ERROR_NONE => 'No error has occurred', 
     JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded', 
     JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded', 
     JSON_ERROR_SYNTAX => 'Syntax error', 
     ); 
     echo 'Last error : ', 

$json_errors[json_last_error()], PHP_EOL, PHP_EOL; 
+0

오류 메시지가 인쇄되지 않았습니다. 그냥 "마지막 오류 :". – user570494

+0

'$ string = trim ($ string, "\ x0");', 시도하지 않았습니다. – user570494

+0

다른 서버에서 시도한 결과 "마지막 오류 : 구문 오류" – user570494

관련 문제