it-swarm.com.de

json_decode gibt JSON_ERROR_SYNTAX zurück, jedoch sagt der Online-Formatierer, dass der JSON in Ordnung ist

Ich habe ein sehr seltsames Problem.

Ich habe einen JSON-Webservice.

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

Alles ist ok.

Aber wenn ich meine JSON mit diesem Code lade:

  $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 habe den Fehler erhalten: SYNTAX ERROR

WAS IS NICHT VOLL HELFEN AT ALL.

Es ist ein Albtraum. 

Ich sehe, dass ich mit PHP 5.5 diese Funktion verwenden könnte: http://php.net/manual/de/function.json-last-error-msg.php

(aber es gelang mir nicht, PHP 5.5 zu installieren, und ich bin mir nicht sicher, ob mir diese Funktion mehr Details geben wird.)

Ich war mit dem gleichen Problem konfrontiert, tatsächlich gibt es einige verborgene Zeichen, die man nicht sieht und man muss sie entfernen .. Hier ist ein globaler Code, der in vielen Fällen 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);
?>
64
Kris Khairallah

Das Entfernen der BOM (Byte Order Mark) ist oft die Lösung, die Sie benötigen:

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

Du solltest keine Stückliste haben, aber wenn sie da ist, ist sie unsichtbar, sodass du sie nicht sehen kannst !!

siehe W3C zu Stücklisten in HTML

verwenden Sie BOM Cleaner , wenn Sie viele Dateien reparieren müssen.

39
Greg Rundlett

Ich habe dieses Problem mit dem Hinzufügen von striplashes zu der Zeichenfolge vor json_decode behoben.

$data = stripslashes($data); 
$obj = json_decode($data);
24
hobbito

Um alles hier und da zusammenzustellen, habe ich den JSON-Wrapper mit automatischen Korrekturmaßnahmen für die Dekodierung vorbereitet. Die aktuellste Version finden Sie in meinem GitHub Gist .

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

Verwendungsbeispiel:

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

Ich habe das gleiche Problem und erhalte JSON_ERROR_CTRL_CHAR und JSON_ERROR_SYNTAX.
Das ist mein Fix.

$content = json_decode(json_encode($content), true);

Sie haben Ihren JSON zwar nicht angezeigt, aber dies klingt nach einer ungültigen UTF-8-Sequenz im Argument. Die meisten Online-Prüfer werden sie nicht einfangen. Stellen Sie sicher, dass Ihre Daten UTF-8 sind, und prüfen Sie auch, ob Sie fremde Zeichen haben. Sie benötigen kein PHP5, um Ihren Fehler zu sehen. Verwenden Sie error_log () , um die Probleme zu protokollieren.

1
meda

Nachdem ich die Lösung ohne Ergebnis ausprobiert hatte, hat sie für mich gearbeitet.

Ich hoffe es hilft jemandem

$data = str_replace('&quot;', '"', $data);
0
Bheru Lal Lohar

Ein Problem von meiner Seite ist, dass es einige ungültige Zahlen gab, die mit 0 beginnen, zB "001", "002", "003".

     "expectedToBeReturned":1,
     "inventoryNumber":001,
     "remindNote":"",

Ersetzen Sie 001 durch 1 und es funktioniert.

0
Stefan Pintilie

Ich hatte die gleichen Probleme. Ich habe folgende Schritte unternommen:

  1. hat die JSON-Textcodierung geändert

    $json = utf8_encode($json);
    
  2. Ich habe mir dann den Klartext vor dem Entschlüsseln angesehen. Ich fand verrückte Symbole wie

    ï

  3. dann habe ich es einfach ausgezogen

    $json = str_replace(array('ï',''), '',$json);
    

    und ich habe meinen JSON erfolgreich dekodiert

0
Bruce Mubangwa