Извлечение JSON из результатов cURL - PullRequest
4 голосов
/ 07 июня 2011

Я новичок в регулярных выражениях и пытаюсь получить ответ JSON от запроса cURL в PHP.

Я думал об использовании preg_match_all.

Редактировать : Должен был упомянуть полный ответ от curl_exec (), включающий информацию заголовка, поэтому мне нужно извлечь JSON.

HTTP/1.1 401 Unauthorized Server: Apache-Coyote/1.1 WWW-Authenticate:  Digest realm="",  qop="auth", [... etc]

JSON, который я хочувыглядит примерно так (после всех заголовков):

{  "requests" :  
  [ { 
     "request_id" : 10298, 
     "name" : "CURL Test2",  
     "submitter" : "First Last",  
     "hide" : false,  
     "priority" : 10,  
     "tags" : [ "label 2" ],  
     "body" : 
          { "type" : "html", "content" : "" },  
     "runs" : 0  
   } ] 
  }

Надеюсь просто схватить все между фигурными скобками.Однако, когда я делаю это, он захватывает все от первой открывающей скобки до первой закрывающей скобки.Для расширяемости, я просто хочу захватить все внутри и включая первую открывающую скобку и last закрывающую скобку.

Технически это может начаться с первой открывающей скобкии вернуть все до конца ответа (после JSON ничего нет).

Мысли?

Ответы [ 2 ]

13 голосов
/ 07 июня 2011

Regex - это прекрасно, но определенно не подходит для этого.

Существует функция json_decode(), которая может справиться с этим для вас.

Это будетвернуть структуру как объект.Вы можете вернуть его как массив, установив для второго аргумента значение TRUE.Даже если в PHP не было этой функции, вам лучше писать или использовать существующий анализатор JSON, чем пытаться извлекать части с помощью регулярного выражения.

Если вы используете заголовки и вам нужно разделить тело на отдельныйпеременная, вы должны сделать что-то вроде следующего, где $ch является экземпляром curl и $result является возвращением curl_exec().

$headerLen = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 
$curlBody = substr($result, $headerLen);`
2 голосов
/ 25 сентября 2012

, поскольку это помогло мне приблизиться к результату, но только «рядом» хотят поделиться своим результатом ..

$json = array ( "firstname" => "john" , "lastname" => "Doe") ; 
$jsonheader = array ( "Accept: application/json" 
, "Content-type:application/json" 
, "Authorization: OAuth oauth_token=xxxxx" ) ;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://myurl.com?oAuth=12341231234' ); // set the target url
curl_setopt($ch, CURLOPT_POST, 1 ); // howmany parameter to post
curl_setopt($ch, CURLOPT_POSTFIELDS, $json ); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); // don't give anything back 
curl_setopt($ch, CURLOPT_HEADER, TRUE );  // need this to evaluate the response .. 
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $jsonheader ); // it is httpheader not httpheader"s" 

$result = curl_exec ($ch);

curl_close ($ch);
$resultarr = explode ( "\n" , $result ) ;
$httpval = explode ( " " , $resultarr[0] ) ; // explode the first line

for ( $i=1 ;  $i < count( $resultarr) ; $i++ ) {
    if ( is_array (json_decode( $resultarr[$i] , true)) ){
        $resultvals  = json_decode( $resultarr[$i] , true) ;
    }       
}
if ( $resultvals['YourKey'] <> '' ) {  // any accepted value in the response ... 
    if ( $httpval[1] == "201" )  {
        $error = 0 ; //  no error Overwrite error 2 
    } else {
        $error = 1 ;  // http response was not 201  .. 
    }
} else {
   $error = 2 ;  // any other error like "no response" or "other error"   
 }
...