PHP Décoder une chaîne JSON


Exemple

La fonction json_decode() prend comme premier paramètre une chaîne codée JSON et l’analyse en une variable PHP.

En règle générale, json_decode() renvoie un objet de \ stdClass si l'élément de niveau supérieur de l'objet JSON est un dictionnaire ou un tableau indexé si l'objet JSON est un tableau. Il renverra également des valeurs scalaires ou NULL pour certaines valeurs scalaires, telles que des chaînes simples, "true" , "false" et "null" . Il renvoie également NULL sur toute erreur.

// Returns an object (The top level item in the JSON string is a JSON dictionary)
$json_string = '{"name": "Jeff", "age": 20, "active": true, "colors": ["red", "blue"]}';
$object = json_decode($json_string);
printf('Hello %s, You are %s years old.', $object->name, $object->age);
#> Hello Jeff, You are 20 years old.

// Returns an array (The top level item in the JSON string is a JSON array)
$json_string = '["Jeff", 20, true, ["red", "blue"]]';
$array = json_decode($json_string);
printf('Hello %s, You are %s years old.', $array[0], $array[1]);

Utilisez var_dump() pour afficher les types et les valeurs de chaque propriété sur l'objet que nous avons décodé ci-dessus.

// Dump our above $object to view how it was decoded
var_dump($object);

Sortie (notez les types de variables):

class stdClass#2 (4) {
 ["name"] => string(4) "Jeff"
 ["age"] => int(20)
 ["active"] => bool(true)
 ["colors"] =>
   array(2) {
     [0] => string(3) "red"
     [1] => string(4) "blue"
   }
}

Note: Les types de variables dans JSON ont été convertis en équivalent PHP.


Pour renvoyer un tableau associatif pour les objets JSON au lieu de renvoyer un objet, transmettez true comme second paramètre à json_decode() .

$json_string = '{"name": "Jeff", "age": 20, "active": true, "colors": ["red", "blue"]}';
$array = json_decode($json_string, true); // Note the second parameter
var_dump($array);

Sortie (notez la structure associative du tableau):

array(4) {
  ["name"] => string(4) "Jeff"
  ["age"] => int(20)
  ["active"] => bool(true)
  ["colors"] =>
  array(2) {
    [0] => string(3) "red"
    [1] => string(4) "blue"
  }
}

Le second paramètre ( $assoc ) n'a aucun effet si la variable à retourner n'est pas un objet.

Remarque: Si vous utilisez le paramètre $assoc , vous perdrez la distinction entre un tableau vide et un objet vide. Cela signifie que l'exécution de json_encode() sur votre sortie décodée entraînera une structure JSON différente.

Si la chaîne JSON a une "profondeur" de plus de 512 éléments ( 20 éléments dans les versions antérieures à 5.2.3, ou 128 dans la version 5.2.3 ) en récursivité, la fonction json_decode() renvoie NULL . Dans les versions 5.3 ou ultérieures, cette limite peut être contrôlée en utilisant le troisième paramètre ( $depth ), comme indiqué ci-dessous.


Selon le manuel:

PHP implémente un sur-ensemble de JSON tel que spécifié dans l'original »RFC 4627 - il va également encoder et décoder les types scalaires et NULL. La RFC 4627 prend uniquement en charge ces valeurs lorsqu'elles sont imbriquées dans un tableau ou un objet. Bien que ce sur-ensemble soit cohérent avec la définition étendue du "texte JSON" dans la nouvelle RFC 7159 (qui remplace les RFC 4627) et ECMA-404 , cela peut entraîner des problèmes d’interopérabilité avec les anciens analyseurs JSON qui respectent strictement la RFC 4627 encoder une seule valeur scalaire.

Cela signifie que, par exemple, une chaîne simple sera considérée comme un objet JSON valide en PHP:

$json = json_decode('"some string"', true);
var_dump($json, json_last_error_msg());

Sortie:

string(11) "some string"
string(8) "No error"

Mais les chaînes simples, pas dans un tableau ou un objet, ne font pas partie de la norme RFC 4627 . En conséquence, des vérificateurs en ligne tels que JSLint , JSON Formatter & Validator (en mode RFC 4627) vous donneront une erreur.

Il existe un troisième paramètre $depth pour la profondeur de la récursivité (la valeur par défaut est 512 ), ce qui signifie la quantité d'objets imbriqués à l'intérieur de l'objet d'origine à décoder.

Il y a un quatrième paramètre $options . Il n'accepte actuellement qu'une seule valeur, JSON_BIGINT_AS_STRING . Le comportement par défaut (qui omet cette option) est de convertir les grands entiers en flottants au lieu de chaînes.

Les variantes non majuscules non valides des littéraux true, false et null ne sont plus acceptées comme entrées valides.

Donc, cet exemple:

var_dump(json_decode('tRue'), json_last_error_msg());
var_dump(json_decode('tRUe'), json_last_error_msg());
var_dump(json_decode('tRUE'), json_last_error_msg());
var_dump(json_decode('TRUe'), json_last_error_msg());
var_dump(json_decode('TRUE'), json_last_error_msg());
var_dump(json_decode('true'), json_last_error_msg());

Avant PHP 5.6:

bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"

Et après:

NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
bool(true)
string(8) "No error"

Un comportement similaire se produit pour false et null .

Notez que json_decode() renverra NULL si la chaîne ne peut pas être convertie.

$json = "{'name': 'Jeff', 'age': 20 }" ;  // invalid json 

$person = json_decode($json);
echo $person->name;    //  Notice: Trying to get property of non-object: returns null
echo json_last_error();     
#  4 (JSON_ERROR_SYNTAX)
echo json_last_error_msg(); 
#  unexpected character 

Il n'est pas sûr de ne compter que sur la valeur de retour NULL pour détecter les erreurs. Par exemple, si la chaîne JSON ne contient rien d'autre que "null" , json_decode() renverra null , même si aucune erreur ne s'est produite.