2013-06-20 7 views
19

Ich habe ein sehr merkwürdiges Problem.json_decode gibt JSON_ERROR_SYNTAX zurück, aber Online-Formatierer sagt, dass der JSON OK ist

Ich habe einen JSON-Webservice.

Wenn ich es mit dieser Website überprüfen http://www.freeformatter.com/json-formatter.html#ad-output

Alles ist in Ordnung.

Aber wenn ich meine JSON mit diesem Code laden:

$data = file_get_contents('http://www.mywebservice'); 

if(!empty($data)) 
{ 

    $obj = json_decode($data); 

switch (json_last_error()) { 
    case JSON_ERROR_NONE: 
     echo ' - JSON_ERROR_NONE'; 
    break; 
    case JSON_ERROR_DEPTH: 
     echo ' - JSON_ERROR_DEPTH'; 
    break; 
    case JSON_ERROR_STATE_MISMATCH: 
     echo ' - JSON_ERROR_STATE_MISMATCH'; 
    break; 
    case JSON_ERROR_CTRL_CHAR: 
     echo ' - JSON_ERROR_CTRL_CHAR'; 
    break; 
    case JSON_ERROR_SYNTAX: 
     echo "\r\n\r\n - SYNTAX ERROR \r\n\r\n"; 
    break; 
    case JSON_ERROR_UTF8: 
     echo ' - JSON_ERROR_UTF8'; 
    break; 
    default: 
     echo ' - Unknown erro'; 
    break; 
} 

ich den Fehler bekam: SYNTAX ERROR

, DIE NICHT AUF ALL voll HELFEN.

Es ist ein Albtraum.

Ich sehe, dass mit PHP 5.5 i diese Funktion nutzen zu können: http://php.net/manual/en/function.json-last-error-msg.php

(aber ich war nicht erfolgreich noch 5,5 PHP zu installieren, und ich bin nicht sicher, ob diese Funktion mir näher geben wird)

+3

Bitte zeigen Sie die JSON. –

+0

JSON bitte. Wir brauchen dein JSON. – vikingmaster

+0

Vielleicht sollten Sie Ihre Fehlermeldungen ausführlicher machen? ZB enthalten Sie den JSON mit der Fehlermeldung? –

Antwort

1

Sie Ich habe kein JSON, aber dieses Geräusch klingt wie eine ungültige UTF-8-Sequenz im Argument. Die meisten Online-Validatoren werden es nicht verstehen. Stellen Sie sicher, dass Ihre Daten UTF-8 sind, und prüfen Sie, ob Sie fremde Zeichen haben. Sie benötigen PHP5 nicht, um Ihren Fehler zu sehen, verwenden Sie error_log(), um die Probleme zu protokollieren.

54

Ich konfrontiert das gleiche Problem, tatsächlich gibt es einige versteckte Zeichen ungesehen und Sie müssen es entfernen. Hier ist ein globaler Code, der für viele Fälle funktioniert:

<?php 
$checkLogin = file_get_contents("http://yourwebsite.com/JsonData"); 

// This will remove unwanted characters. 
// Check http://www.php.net/chr for details 
for ($i = 0; $i <= 31; ++$i) { 
    $checkLogin = str_replace(chr($i), "", $checkLogin); 
} 
$checkLogin = str_replace(chr(127), "", $checkLogin); 

// This is the most common part 
// Some file begins with 'efbbbf' to mark the beginning of the file. (binary level) 
// here we detect it and we remove it, basically it's the first 3 characters 
if (0 === strpos(bin2hex($checkLogin), 'efbbbf')) { 
    $checkLogin = substr($checkLogin, 3); 
} 

$checkLogin = json_decode($checkLogin); 
print_r($checkLogin); 
?> 
+0

Nur diese Lösung hat mir geholfen. danke –

+1

Sehr geehrter Herr, Sie haben keine Ahnung, wie sehr mir das geholfen hat. Ich habe überall nach der Lösung gesucht und fast aufgegeben. Sir, Sie sind ein Geschenk des Himmels. – deepakgates

+0

Ich frage mich immer noch, warum dies nicht Teil von Core PHP in Version 7.0.x ist. (Gesicht Handfläche) –

16

ich dieses Problem gelöst Zugabe strip auf den String, bevor json_decode.

$data = stripslashes($data); 
$obj = json_decode($data); 
+1

Bitte formatieren Sie Ihren Code. Vielen Dank. –

+3

sollte es nicht sein $ data = stripslashes ($ data); – TarranJones

+0

Dies ist die einzige Lösung, die mir geholfen – Harsh

26

die BOM (Byte Order Mark) ist oft mal die Lösung für Sie ausbauen:

function removeBOM($data) { 
    if (0 === strpos(bin2hex($data), 'efbbbf')) { 
     return substr($data, 3); 
    } 
    return $data; 
} 

Sie sollten nicht eine Stückliste, aber wenn es da ist, ist es unsichtbar, so gewann man Ich sehe es nicht !!

siehe W3C on BOM's in HTML

Verwendung BOM Cleaner, wenn Sie viel von Dateien zu beheben haben.

+0

Ich habe die Codierung von 'UTF-8' nach' UTF-8 ohne BOM' von 'Notepad ++' aus 'Menü oben von Notepad ++> Format> UTF-8 ohne BOM' – deadfish

+0

Fast 1 verloren Stunde, die eine Million Sachen versucht, bevor ich diese Antwort fand ... danke Haufen! – dmmd

0

Ich hatte das gleiche Problem. Für mich hat es durch echo "<br/><pre>" verursacht. Ich habe versucht, JSON-String zu einem anderen PHP-Datei mit exit(json_encode(utf8ize($resp_array))); übergeben. Am Anfang der Datei hatte ich Bruchlinie Tag deklariert ... Also das war Fehler für mich. Entfernen dieser Bruchlinie Tag, konnte ich meine JSON-Zeichenfolge eine andere PHP-Datei entschlüsseln ..

3

Um alle Dinge hier und da zusammen zu setzen, habe ich JSON-Wrapper mit Decodierung Auto-Korrekturmaßnahmen vorbereitet.

abstract class Json 
{ 
    public static function getLastError($asString = FALSE) 
    { 
     $lastError = \json_last_error(); 

     if (!$asString) return $lastError; 

     // Define the errors. 
     $constants = \get_defined_constants(TRUE); 
     $errorStrings = array(); 

     foreach ($constants["json"] as $name => $value) 
      if (!strncmp($name, "JSON_ERROR_", 11)) 
       $errorStrings[$value] = $name; 

     return isset($errorStrings[$lastError]) ? $errorStrings[$lastError] : FALSE; 
    } 

    public static function getLastErrorMessage() 
    { 
     return \json_last_error_msg(); 
    } 

    public static function clean($jsonString) 
    { 
     if (!is_string($jsonString) || !$jsonString) return ''; 

     // Remove unsupported characters 
     // Check http://www.php.net/chr for details 
     for ($i = 0; $i <= 31; ++$i) 
      $jsonString = str_replace(chr($i), "", $jsonString); 

     $jsonString = str_replace(chr(127), "", $jsonString); 

     // Remove the BOM (Byte Order Mark) 
     // It's the most common that some file begins with 'efbbbf' to mark the beginning of the file. (binary level) 
     // Here we detect it and we remove it, basically it's the first 3 characters. 
     if (0 === strpos(bin2hex($jsonString), 'efbbbf')) $jsonString = substr($jsonString, 3); 

     return $jsonString; 
    } 

    public static function encode($value, $options = 0, $depth = 512) 
    { 
     return \json_encode($value, $options, $depth); 
    } 

    public static function decode($jsonString, $asArray = TRUE, $depth = 512, $options = JSON_BIGINT_AS_STRING) 
    { 
     if (!is_string($jsonString) || !$jsonString) return NULL; 

     $result = \json_decode($jsonString, $asArray, $depth, $options); 

     if ($result === NULL) 
      switch (self::getLastError()) 
      { 
       case JSON_ERROR_SYNTAX : 
        // Try to clean json string if syntax error occured 
        $jsonString = self::clean($jsonString); 
        $result = \json_decode($jsonString, $asArray, $depth, $options); 
        break; 

       default: 
        // Unsupported error 
      } 

     return $result; 
    } 
} 

Beispiel Nutzung:

$json_data = file_get_contents("test.json"); 
$array = Json::decode($json_data, TRUE); 
var_dump($array); 
echo "Last error (" , Json::getLastError() , "): ", Json::getLastError(TRUE), PHP_EOL; 
+0

Ich habe den ganzen Tag mit einer seltsam verschlüsselten Datei, die JSON enthält, gekämpft und diese Klasse hat mir endlich ein brauchbares PHP-Array gebracht - danke! – Hill79

0

Ich hatte dasselbe Problem. Für mich hat es durch echo "<br/><pre>" verursacht.

Ich habe versucht, JSON-String in einer anderen PHP-Datei mit weitergeben müssen: I-Tag Bruchlinie

exit(json_encode(utf8ize($resp_array))); 

Zu Beginn der Datei decleared hatte ... Also das war für mich Fehler. Entfernen dieses Bruchlinie Tag, konnte ich [...]

+0

Dies ist nicht das gleiche Problem wie in der Frage beschrieben, aber es ist eine sehr häufige Art von Problem und kann schwer zu erkennen sein, so ist es gut, es erwähnt zu haben. – Simba

Verwandte Themen