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
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.
-
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()); } -
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.
-
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.
-
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.
-
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