Aller au contenu
jsonbeautifiers
Français
PHP Noms de constantes et messages tirés du manuel PHP.

json_decode() returns NULL

PHP ne lève pas d’exception sur du JSON invalide par défaut. json_decode renvoie simplement NULL, ce qui est aussi un résultat légitime pour l’entrée "null" : vous ne pouvez donc pas distinguer l’échec du succès à la seule valeur de retour. La première tâche est de faire dire à PHP ce qui a échoué.

Collez votre JSON et voyez exactement où il casse

Entrée

Rien de ce que vous collez ne quitte votre navigateur. La liste d’autorisation connect-src en fait une garantie du navigateur plutôt qu’une promesse. Vérifiez-le vous-même

Ce qui le provoque réellement

Classés selon la fréquence à laquelle chacun se révèle être la réponse.

  1. 01 Vous n’avez encore aucun message d’erreur

    Appelez json_last_error_msg() juste après le décodage, ou passez le drapeau JSON_THROW_ON_ERROR pour qu’une JsonException soit levée à la place. Sans l’un des deux, vous déboguez à l’aveugle, et c’est pourquoi ce problème prend tant de temps.

    Casse

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

    Fonctionne

    $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 Une marque d’ordre des octets UTF-8 en tête de fichier

    Un classique en PHP, car file_get_contents renvoie le BOM et json_decode le rejette. Retirez les trois premiers octets s’ils valent EF BB BF.

  3. 03 De l’UTF-8 malformé, donnant JSON_ERROR_UTF8

    « Malformed UTF-8 characters, possibly incorrectly encoded » signifie généralement que les données viennent d’une colonne de base en Latin-1. Convertissez avec mb_convert_encoding avant de décoder.

  4. 04 Un warning ou une notice affiché avant le JSON

    Toute sortie antérieure au corps de votre réponse finit dedans. Désactivez display_errors en production et journalisez plutôt.

  5. 05 Une imbrication plus profonde que la limite par défaut, donnant JSON_ERROR_DEPTH

    json_decode utilise une profondeur de 512 par défaut. Augmentez le troisième argument si les données sont réellement aussi profondes.

Questions fréquentes

Quelles sont les constantes JSON_ERROR ?
JSON_ERROR_NONE (0), JSON_ERROR_DEPTH (1, profondeur de pile maximale dépassée), JSON_ERROR_STATE_MISMATCH (2), JSON_ERROR_CTRL_CHAR (3, caractère de contrôle inattendu), JSON_ERROR_SYNTAX (4, erreur de syntaxe, JSON malformé), JSON_ERROR_UTF8 (5, caractères UTF-8 malformés), plus JSON_ERROR_RECURSION, JSON_ERROR_INF_OR_NAN, JSON_ERROR_UNSUPPORTED_TYPE, JSON_ERROR_INVALID_PROPERTY_NAME, JSON_ERROR_UTF16 et JSON_ERROR_NON_BACKED_ENUM.
Comment distinguer un résultat NULL d’un échec NULL ?
json_last_error() === JSON_ERROR_NONE signifie que le décodage a réussi : un NULL renvoyé est alors la véritable valeur null. Tout autre code signifie un échec.

Corrigez-le maintenant

Collez le payload dans l’outil ci-dessus, ou allez directement à celui conçu pour ce travail.

Trouver l’erreur de syntaxe