2016-03-27 10 views
2

Die folgende JSON-Zeichenfolge wird in json_decode() übergeben und gibt NULL zurück.json_decode - Rückgabe NULL

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

Hier ist mein Code:

$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 ist noch NULL.

+0

Was ist $ Home_Team_link? –

+0

@Abitnew Das spielt in diesem Zusammenhang keine Rolle. Das Beispiel JSON ist '{" total_goals ": 26," total_games ": 17," durchschnittliche_ziele ":" 1.53 "}' – CMS

+0

ist das der json in '$ clean'? – Jeff

Antwort

5

Zunächst gibt json_decode() aufgrund eines Fehlerzustands NULL zurück. Sie können die Art der Fehlerbedingung mithilfe von json_last_error() ermitteln, die eine Ganzzahlkonstante zurückgibt, die den Fehlertyp darstellt. Sie können diese mit dieser Funktion (von den Fehlercodes beschrieben auf der json_last_error() Handbuch Seite gebaut) dekodieren:

<?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'; 
} 

Nun, ich kann nicht herausfinden, genau das, was die API Sie zurückgegeben anrufen, weil ein gültiges Link nicht vorgesehen war (und ich verstehe diese sensible Daten sein kann), aber lassen Sie uns einen anderen Ansatz versuchen, und nur versuchen nur die JSON aus, was auch immer extrahieren die API zurückkehrt:

<?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]); 

Dies ist Arbeiten gegen die tatsächliche Ausgabe von der API (ohne eine richtige URL) für mich:

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

Auch wenn die API selbst HTML zurückgibt, das mit JSON gemischt ist.

bearbeiten: Da Sie eine gültige URL zur Verfügung gestellt, habe ich einige mehr Debugging:

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 
    ... 

Byte 7b ist die Öffnung { wo das gültige JSON beginnt. Bytes 0-3 sind ein UTF-8 Byte Order Mark. Also, während meine regex Lösung oben wird immer noch funktionieren, können wir auch nur die Stückliste aufzuräumen und alle Streunullzeichen wie folgt aus:

$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); 

Das gibt mir:

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