json_decode — возвращает NULL

Следующая строка JSON передается в json_decode()и возвращается 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,

2

Решение

Прежде всего, 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.

редактировать: Так как вы предоставили действительный 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. Таким образом, хотя мое решение для регулярных выражений, приведенное выше, все еще будет работать, мы также можем просто очистить спецификацию и любые случайные нулевые символы, подобные этому:

$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"}
5

Другие решения

Других решений пока нет …