Zum Inhalt springen
jsonbeautifiers
Deutsch
PHP Konstantennamen und Meldungen aus dem PHP-Handbuch.

json_decode() returns NULL

PHP wirft bei ungültigem JSON standardmäßig nichts. json_decode gibt schlicht NULL zurück - was zugleich ein legitimes Ergebnis für die Eingabe "null" ist, sodass Sie Fehlschlag und Erfolg am Rückgabewert allein nicht unterscheiden können. Die erste Aufgabe ist, PHP dazu zu bringen, Ihnen zu sagen, was schiefging.

Fügen Sie Ihr JSON ein und sehen Sie genau, wo es bricht

Eingabe

Nichts, was Sie einfügen, verlässt Ihren Browser. Die connect-src Erlaubnisliste macht daraus eine Garantie des Browsers statt eines Versprechens. Selbst überprüfen

Was es tatsächlich auslöst

Sortiert danach, wie oft sich das jeweilige als die Antwort herausstellt.

  1. 01 Sie haben noch überhaupt keine Fehlermeldung

    Rufen Sie json_last_error_msg() unmittelbar nach dem Dekodieren auf, oder übergeben Sie das Flag JSON_THROW_ON_ERROR, damit stattdessen eine JsonException geworfen wird. Ohne eines von beidem debuggen Sie blind, und deshalb kostet dieses Problem so viel Zeit.

    Geht kaputt

    $data = json_decode($body, true);
    if ($data === null) { /* why? */ }

    Funktioniert

    $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
    // or
    $data = json_decode($body, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new RuntimeException(json_last_error_msg());
    }
  2. 02 Ein UTF-8-Byte-Order-Mark am Dateianfang

    Ein Klassiker in PHP, weil file_get_contents das BOM mitliefert und json_decode es ablehnt. Entfernen Sie die ersten drei Bytes, wenn sie EF BB BF lauten.

  3. 03 Fehlerhaftes UTF-8, das JSON_ERROR_UTF8 ergibt

    „Malformed UTF-8 characters, possibly incorrectly encoded“ heißt meist, dass die Daten aus einer Latin-1-Datenbankspalte stammen. Wandeln Sie vor dem Dekodieren mit mb_convert_encoding um.

  4. 04 Eine vor dem JSON ausgegebene Warnung oder Notice

    Jede Ausgabe vor Ihrem Antwortkörper landet in ihm. Schalten Sie display_errors in der Produktion aus und protokollieren Sie stattdessen.

  5. 05 Tiefere Verschachtelung als das Standardlimit, was JSON_ERROR_DEPTH ergibt

    json_decode arbeitet standardmäßig mit einer Tiefe von 512. Erhöhen Sie das dritte Argument, wenn die Daten wirklich so tief sind.

Häufige Fragen

Was sind die JSON_ERROR-Konstanten?
JSON_ERROR_NONE (0), JSON_ERROR_DEPTH (1, maximale Stapeltiefe überschritten), JSON_ERROR_STATE_MISMATCH (2), JSON_ERROR_CTRL_CHAR (3, unerwartetes Steuerzeichen gefunden), JSON_ERROR_SYNTAX (4, Syntaxfehler, fehlerhaftes JSON), JSON_ERROR_UTF8 (5, fehlerhafte UTF-8-Zeichen), dazu JSON_ERROR_RECURSION, JSON_ERROR_INF_OR_NAN, JSON_ERROR_UNSUPPORTED_TYPE, JSON_ERROR_INVALID_PROPERTY_NAME, JSON_ERROR_UTF16 und JSON_ERROR_NON_BACKED_ENUM.
Wie unterscheide ich ein NULL-Ergebnis von einem NULL-Fehlschlag?
json_last_error() === JSON_ERROR_NONE bedeutet, dass das Dekodieren geklappt hat, ein zurückgegebenes NULL ist dann der echte Wert null. Jeder andere Code bedeutet Fehlschlag.

Jetzt beheben

Fügen Sie das Payload in das Werkzeug oben ein, oder gehen Sie direkt zu dem, das für diesen Zweck gebaut wurde.

Den Syntaxfehler finden