Menu

PHP json_decode() : lire du JSON en tableau ou en objet

json_decode($json, true) transforme une chaîne JSON en tableau associatif PHP ; sans true, vous obtenez des objets stdClass. Valeurs imbriquées, gestion des erreurs avec JSON_THROW_ON_ERROR, json_validate() et pourquoi json_decode renvoie null.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

json_decode($json, true) transforme une chaîne JSON en valeurs PHP, chaque objet JSON devenant un tableau associatif. Omettez true et les objets JSON deviennent plutôt des objets stdClass, lus avec ->. Un JSON invalide donne null.

Sortie :

Ada
js
Ada
php
Array
(
    [name] => Ada
    [age] => 36
    [langs] => Array
        (
            [0] => php
            [1] => js
        )

    [admin] => 1
)

Les tableaux JSON deviennent toujours des listes PHP, quel que soit le mode choisi. Dans l'autre sens, de PHP vers JSON, c'est json_encode().

Tableau associatif ou objet : true ou false

Les deux modes contiennent les mêmes données ; choisissez celui qui se lit le mieux dans votre code. Les tableaux fonctionnent avec toutes les fonctions de tableau (array_column, array_map, isset($data['key'])), c'est pourquoi la plupart du code passe true. Les objets demandent la syntaxe à accolades pour les clés qui ne sont pas des noms de propriété valides, comme les clés avec un tiret ou un nombre :

Sortie :

Ada zero London
Ada zero London
object(stdClass)#2 (1) {
  ["city"]=>
  string(6) "London"
}

Le quatrième paramètre prend des options. JSON_OBJECT_AS_ARRAY donne aussi des tableaux, mais seulement tant que le second argument vaut null (sa valeur par défaut) : json_decode($json, flags: JSON_OBJECT_AS_ARRAY) renvoie des tableaux, alors que json_decode($json, false, 512, JSON_OBJECT_AS_ARRAY) renvoie toujours des objets.

Parcourir du JSON imbriqué

Les réponses d'API sont en général une liste d'objets dans un objet. Décodez une fois, puis parcourez avec foreach, et utilisez ?? pour les champs qui peuvent manquer :

Sortie :

#1 Ada <ada@example.com> roles: admin, editor
#2 Linus <no email> roles: none
#3 Grace <grace@example.com> roles: editor
Array
(
    [1] => Ada
    [2] => Linus
    [3] => Grace
)

Gérer un JSON invalide

json_decode() renvoie null pour un JSON invalide, mais null est aussi le bon résultat pour le texte JSON null, donc null seul ne dit pas si le décodage a échoué. json_last_error_msg() donne la raison du dernier appel. La façon plus propre est JSON_THROW_ON_ERROR, qui lève une JsonException :

Sortie :

NULL
Syntax error
NULL
No error
Invalid JSON: Syntax error

Le troisième argument, 512, est la profondeur d'imbrication maximale (la valeur par défaut). Avec les arguments nommés, vous pouvez le sauter : json_decode($json, true, flags: JSON_THROW_ON_ERROR).

Vérifier si une chaîne est du JSON valide avec json_validate()

PHP 8.3 a ajouté json_validate(). Elle répond true ou false sans construire les tableaux décodés, elle utilise donc moins de mémoire que le décodage quand vous n'avez besoin que d'un oui ou d'un non, par exemple pour rejeter tôt le corps d'une requête :

Sortie :

'{"a": 1}'    valid
'[1, 2, 3]'   valid
'"text"'      valid
'{a: 1}'      invalid: Syntax error
'{\'a\': 1}'  invalid: Syntax error
''            invalid: Syntax error

Si vous allez de toute façon utiliser les données, sautez json_validate() et décodez avec JSON_THROW_ON_ERROR : valider d'abord analyse la chaîne deux fois.

Lire un fichier JSON

Lisez le fichier avec file_get_contents() et décodez la chaîne. Ce bloc écrit d'abord settings.json pour qu'il y ait un fichier à lire :

Sortie :

Theme: dark
Plugins: 2
{
    "theme": "dark",
    "fontSize": 16,
    "plugins": [
        "git",
        "lint"
    ]
}

Pourquoi json_decode renvoie null : les causes habituelles

Le JSON est plus strict que la syntaxe des tableaux JavaScript et PHP. Chaque chaîne ci-dessous semble raisonnable et chacune renvoie null. Exécutez-le pour voir la raison de chacune, puis corrigez-en une et relancez :

Sortie :

single quotes    Syntax error
unquoted key     Syntax error
trailing comma   Syntax error
comment          Syntax error
byte order mark  Syntax error
too deep         Maximum stack depth exceeded
float(1.2345678901234567E+19)
string(20) "12345678901234567890"

Une marque d'ordre des octets (BOM) est invisible dans la plupart des éditeurs et c'est la raison classique pour laquelle un fichier JSON « a l'air correct » mais refuse de se décoder. Retirez-la avec $text = preg_replace('/^\xEF\xBB\xBF/', '', $text); avant de décoder.

Questions fréquentes

Comment convertir du JSON en tableau en PHP ?

Passez true en second argument : json_decode('{"name":"Ada"}', true) renvoie ['name' => 'Ada'], et vous lisez les valeurs avec $data['name']. Sans true, les objets JSON deviennent des objets stdClass et vous écrivez $data->name.

Pourquoi json_decode renvoie-t-il null ?

Le JSON est invalide (guillemets simples, virgule finale, clés sans guillemets, marque d'ordre des octets), il est imbriqué plus profondément que la limite, ou le JSON vaut réellement null. Vérifiez json_last_error_msg(), ou décodez avec JSON_THROW_ON_ERROR pour obtenir une JsonException avec la raison.

Comment vérifier si une chaîne est du JSON valide en PHP ?

Depuis PHP 8.3, json_validate($string) renvoie true ou false sans construire la valeur décodée. Dans les versions plus anciennes, décodez-la et vérifiez json_last_error() === JSON_ERROR_NONE.

Comment lire un fichier JSON en PHP ?

Lisez le fichier, puis décodez-le : $data = json_decode(file_get_contents('data.json'), true, flags: JSON_THROW_ON_ERROR);. file_get_contents() renvoie false si le fichier manque, vérifiez donc cela d'abord.

Comment accéder à une clé JSON contenant un tiret en PHP ?

Décodez en tableau et utilisez $data['first-name'], ou avec des objets utilisez des accolades : $obj->{'first-name'}. La même syntaxe à accolades fonctionne pour des clés qui sont des nombres, comme $obj->{'0'}.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER