2016-03-27 5 views
2

Ниже строка JSON передается в json_decode() и возвращается NULL.json_decode - return NULL

{"total_goals":26,"total_games":17,"average_goals":"1.53"} 

Вот мой код:

$homeJSON = file_get_contents("http://strategy-bets.com/archive/archive.php?baseurl=http://www.totalcorner.com".$Home_Team_Link); 

$homeJSON = str_replace("\xEF\xBB\xBF",'',$homeJSON); 
$homeJSON = rtrim($homeJSON); 
$homeJSON = html_entity_decode($homeJSON); 
$homeJSON = preg_replace('/\s+/', '', $homeJSON); 
$clean = rtrim($homeJSON, "\x00..\x1F"); 

$home_decoded = json_decode($clean); 

$home_decoded еще NULL.

+0

Что такое $ Home_Team_link? –

+0

@Abitnew Это не имеет большого значения в этом контексте. Пример JSON: '{" total_goals ": 26," total_games ": 17," average_goals ":" 1.53 "}' – CMS

+0

- то, что json в '$ clean'? – Jeff

ответ

5

Прежде всего, json_decode() возвращает NULL из-за ошибки. Вы можете определить характер ошибки с использованием json_last_error(), который возвращает целочисленную константу, представляющую тип ошибки. Вы можете расшифровать их с помощью этой функции (встроенной из кодов ошибок, описанных на странице руководства по json_last_error()):

<?php 
function decodeJsonError($errorCode) 
{ 
    $errors = array(
     JSON_ERROR_NONE => 'No error has occurred', 
     JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded', 
     JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON', 
     JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded', 
     JSON_ERROR_SYNTAX => 'Syntax error', 
     JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded', 
     JSON_ERROR_RECURSION => 'One or more recursive references in the value to be encoded', 
     JSON_ERROR_INF_OR_NAN => 'One or more NAN or INF values in the value to be encoded', 
     JSON_ERROR_UNSUPPORTED_TYPE => 'A value of a type that cannot be encoded was given' 
    ); 

    if (isset($errors[$errorCode])) 
    { 
     return $errors[$errorCode]; 
    } 

    return 'Unknown error'; 
} 

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

<?php 

$homeJSON = file_get_contents("http://strategy-bets.com/archive/archive.php?baseurl=http://www.totalcorner.com".$Home_Team_Link); 

if (!preg_match('/(\{"[^\}]+\})/', $homeJSON, $matches)) 
{ 
    echo "An error occurred; no JSON found."; 
    return; 
} 

$home_decoded = json_decode($matches[1]); 

Это работая против фактического вывода из API (без правильного URL) для меня:

file_get_contents("http://strategy-bets.com/archive/archive.php?baseurl=http://www.totalcorner.com"); 

Несмотря на то, что сам API возвращает HTML-код, смешанный с JSON.

Edit: Поскольку вы предоставили действительный URL, я сделал еще несколько отладки:

php > print_r(array_map('dechex', array_map('ord', str_split($homeJSON)))); 
Array 
(
    [0] => ef 
    [1] => bb 
    [2] => bf 
    [3] => 7b 
    [4] => 22 
    [5] => 74 
    [6] => 6f 
    [7] => 74 
    [8] => 61 
    [9] => 6c 
    ... 

Байт 7b является открытие {, где начинается действительный JSON. Байт 0-3 - UTF-8 Byte Order Mark. Таким образом, в то время как мое регулярное выражение выше раствор будет продолжать работать, мы можем просто очистить BOM и любые шальная нулевые символы вроде этого:

$homeJSON = file_get_contents("http://strategy-bets.com/archive/archive.php?baseurl=http://www.totalcorner.com".$Home_Team_Link); 

$homeJSON = trim($homeJSON, "\x0\xEF\xBB\xBF"); 

$home_decoded = json_decode($homeJSON); 

Это дает мне:

php > var_dump(json_decode($jsonCopy)); 
object(stdClass)#1 (3) { 
    ["total_goals"]=> 
    int(26) 
    ["total_games"]=> 
    int(17) 
    ["average_goals"]=> 
    string(4) "1.53" 
}