Manipulation du JSON en PHP avec json_encode et json_decode.

Méthodes avancées d'utilisation et de manipulation des données au format JSON (JavaScript Object Notation) avec le langage PHP (json_encode et json_decode).

  Publié le

Qu'est-ce que le JSON ?

Le JSON est l'acronyme de JavaScript Objet Notation.Il sert à structurer des ensembles de données dans une structure évolutive. C'est un format texte très léger qui est principalement utilisé pour l'échange des données. Historiquement, le JSON nous vient d'un sous-ensemble du JavaScript, mais reste totalement indépendant de ce langage de développement.

Il est présenté à tort comme une variante du métalangage XML. Or il n'en est rien, étant donné qu'il n'offre pas nativement le tiers des possibilités du XML (absence des espaces de nom et des systèmes de validation standardisés). Le JSON n'en reste pas moins un outil très intéressant et parfaitement adapté à bon nombre de développement.

Quel intérêt d'utiliser le JSON ?

L'intérêt principal du JSON réside dans son faible poids par rapport à d'autres formats plus gourmands comme le XML. Sur des structures simples à moyennement complexe le il est également plus intuitif à lire pour un non initié, de par sa structure clé/valeur. Il est également important de noter qu'il est parfaitement portable sur tout langage de développement. 

Où stocker du JSON ?

Il peut parfaitement être stocké en base de données, dans des fichiers, dans des cookies, ou même grâce à localStorage du navigateur.

Comment se structure un objet JSON ?

Le JSON respecte le principe de l'arborescence. Un élément racine, dont peuvent découler un ou plusieurs couples clé/valeur. Pouvant eux-mêmes comporter un ou plusieurs couples clé/valeur, etc. L'ensemble de cette structure répond parfaitement aux besoins de récursivités des jeux de données complexes. Bien qu'il ne soit pas initialement conçu pour répondre à ce besoin, il est parfaitement envisageable de l'utiliser pour stocker des données à récursivités indirectes.

{
    "root": {
        "node_1": "valeur de node_1",
		"node_2": {
            "child_node_1": "valeur de child_node_1",
			"child_node_1": {
                "sub_child_node_1": {
                    "property_1": "1"
                    "property_2": "php"
                    "property_2": "json"
                }
            }
        }
    } //fin de root
}

Comment initialiser une représentation correcte JSON d'un objet avec PHP ?

L'initialisation d'une représentation de valeur correctement formatée en JSON s'effectue au travers de l'objet array ou avec l'aide l'objet stdClass. Dans les deux cas une fois notre objet stdClass ou nos array générés ou utilise json_encode avec pour premier paramètre l'objet ou le tableau et en second paramètre la constante JSON_FORCE_OBJECT.

Ici avec l'aide de l'objet stdClass :

		$obj = new stdClass();
		$obj->post = "Méthodes de manipulation du JSON en PHP avec json_encode et json_decode.";
		$obj->time_read = 5;
		$obj->author = "AIS";
		$str_json = json_encode($obj,JSON_FORCE_OBJECT);


//Variante d'initialisation :
		$obj = (object) [
			'post' => 'Méthodes de manipulation du JSON en PHP avec json_encode et json_decode.',
			'time_read' => 5,
			'author'=>"AIS"
		];
		$str_json = json_encode($obj,JSON_FORCE_OBJECT);

Ou pour arriver au même résultat par des tableaux imbriqués :

	    $arr = array(
					"post"=>"Méthodes de manipulation du JSON en PHP avec json_encode et json_decode.",
					"time_read"=>5,
					"author"=>"AIS"
				);
		$str_json = json_encode($arr,JSON_FORCE_OBJECT);

Comment convertir une chaine de caractères JSON vers un objet ou un tableau associatif avec PHP ?

La conversion d'une chaine de caractères correctement formatée, contenue dans une variable PHP vers un objet JSON s'effectue grâce à la méthode json_decode. Le premier paramètre de la fonction correspond à notre chaine de caractères à convertir, et le second paramètre permet de spécifier si nous souhaitons travailler avec un tableau associatif en lui assignant la valeur true.

$str_json = '{"post":"M\u00e9thodes de manipulation du JSON en PHP avec json_encode et json_decode.","time_read":5,"author":"AIS"}';
$my_array = json_decode($str_json,true);

//un var_dump de my_array retourne : 
array(3) {
  ["post"]=>
  string(73) "Méthodes de manipulation du JSON en PHP avec json_encode et json_decode."
  ["time_read"]=>
  int(5)
  ["author"]=>
  string(3) "AIS"
} 

A l'inverse si vous souhaitez un objet de type stdClass il suffit de ne pas fournir de second paramètre :

$str_json = '{"post":"M\u00e9thodes de manipulation du JSON en PHP avec json_encode et json_decode.","time_read":5,"author":"AIS"}';
$object_stdclass = json_decode($str_json);

//un var_dump de object_stdclass retourne : 
object(stdClass)#2 (3) {
  ["post"]=>
  string(73) "Méthodes de manipulation du JSON en PHP avec json_encode et json_decode."
  ["time_read"]=>
  int(5)
  ["author"]=>
  string(3) "AIS"
}

Pourquoi est-il préférable d'utiliser des tableaux associatifs pour manipuler des éléments JSON ?

Interprétation strictement personnelle
Pour trois raisons, premièrement la syntaxe d'utilisation est beaucoup plus courte à rédiger (2 caractères contres 4 autrement) on limite donc et les erreurs et la taille de nos scripts. Deuxièmement, car la standardisation des structures permet de ne manipuler que des tableaux donc de bénéficier des méthodes existantes (ex : isset pour contrôler la présence d'une entrée). Enfin, car une méthode qui attend un tableau en entrée pourra aussi bien s'interfacer avec des données JSON assignées à un tableau associatif, que le résultat d'un appel select à la base de données. En développant ainsi on valide donc l'un des principes fondateurs du génie logiciel : la réutilisation.

Comment sauvegarder un objet ou un tableau associatif dans un fichier en PHP en le convertissant en JSON ?

Pour sauvegarder un objet ou un tableau dans un fichier en PHP, il convient de convertir dans un premier temps l'objet en chaines de caractères JSON valide à l'aide de la méthode json_encode (comme vue plus haut). Puis à l'aide de la fonction PHP file_put_contents qui attend deux paramètres, on assigne en premier paramètre l'emplacement et le nom du fichier. En seconds paramètres, la variable qui contient le résultat de json_encode. Notez l'utilisation de la constante LOCK_EX pour éviter les accès concurentiels sur le fichier.

Avec un objet stdClass :

		$obj = new stdClass();
		$obj->post = "Tutoriel json_encode et json_decode";
		$obj->comment = "Comment utiliser JSON en PHP";
		$json = json_encode($obj,JSON_FORCE_OBJECT);
		file_put_contents("monfichier.json",$json,LOCK_EX);

Avec un tableau associatif :

		$arr = array(
					"post"=>"Tutoriel json_encode et json_decode",
					"comment"=>"Comment utiliser JSON en PHP"
				);
		$json = json_encode($arr,JSON_FORCE_OBJECT);
		file_put_contents("monfichier.json",$json,LOCK_EX);

Et pour sauvegarder le contenu d'un tableau avec du JSON sans être pollué par l'index :

		$arr = array(
					"post"=>"Tutoriel json_encode et json_decode",
					"comment"=>"Comment utiliser JSON en PHP"
				);
		$json = json_encode(array_values($arr));
		file_put_contents("monfichier.json",$json,LOCK_EX);

Comment convertir le contenu d'un fichier JSON vers un tableau associatif ou un objet stdClass en PHP ?

Pour convertir le contenu d'un fichier en objet ou en tableau associatif, il suffit de récupérer le contenu de notre fichier JSON à l'aide de la méthode file_get_contents et de l'assigner à une variable. Cette variable est ensuite convertie en objet JSON à l'aide de la méthode json_decode.

$str_json = file_get_contents("monfichier.json");
$object_stdclass = json_decode($str_json);

//Retour d'un var_dump de object_stdclass 
object(stdClass)#1 (2) {
  ["post"]=>
  string(35) "Tutoriel json_encode et json_decode"
  ["comment"]=>
  string(28) "Comment utiliser JSON en PHP"
}

Maintenant pour réaliser une conversion en tableau associatif :

$str_json = file_get_contents("monfichier.json");
$arr = json_decode($str_json,true);

//Retour d'un var_dump de arr :
array(2) {
  ["post"]=>
  string(35) "Tutoriel json_encode et json_decode"
  ["comment"]=>
  string(28) "Comment utiliser JSON en PHP"
}

Comment sauvegarder un objet JSON dans une base de données MySQL ?

Pour sauvegarder la représentation JSON d'un objet ou d'un tableau dans une base de données MySQL, il suffit de convertir l'objet en chaine de caractères à l'aide de la méthode json_encode. Il faut ensuite assigner le résultat de la variable au tableau associatif qui sera utilisé pour préparer la requête avant son exécution.

//Conversion en JSON
$arr = array(
	"post"=>"Tutoriel json mysql",
	"comment"=>"Comment utiliser JSON en PHP avec MySQL"
);
$json = json_encode($arr,JSON_FORCE_OBJECT);

//Initialisation de l'objet PDO (ouverture de la connexion) 
$dal = new PDO("mysql:host=127.0.0.1;dbname=DataBase", "user", "password", array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

//Insertion en base de données
$query = "INSERT INTO table_json_demo(content_json,name) VALUES (:json,:name)";
$request = $dal->prepare($query);
$request->execute(array(
	'json' => $json,
	'name'=>'demo'
));

//Récupération en base de données 
$query = "SELECT content_json FROM table_json_demo WHERE name=:name";
$request = $dal->prepare($query);
$request->execute(array(
	'name' => 'demo'
));

$str_json = $request->fetchAll()[0]["content_json"];

//Conversion en tableau associatif
$arr = json_decode($str_json, true);

Comment accéder aux erreurs de conversion ?

Pour accéder aux erreurs de conversion d'une chaine de caractères vers un objet JSON, il convient d'utiliser la méthode json_last_error. Si cette méthode retourne la valeur de la constante JSON_ERROR_SYNTAX alors la chaine de caractères ne répond pas aux formats JSON. (Dans l'exemple suivant nous supprimons volontairement la première accolade de notre chaine de caractères pour provoquer l'erreur de conversion).

$str_json_invalid = '"post":"Tutoriel php","comment":"Comment utiliser PHP"}';
$arr = json_decode($str_json_invalid, true);
if(json_last_error() == JSON_ERROR_SYNTAX){
	echo 'La chaine de caractères ne correspond pas à un format JSON valide';
}

Comment parcourir les données d'un tableau associatif JSON  ?

Si vous avez suivi les premières étapes, lors de l'utilisation de json_decode vous utilisez le second paramètre en lui assignant la valeur true. Vous avez donc des tableaux associatifs à manipuler. Ces tableaux se manipulent comme n'importe quel tableau en PHP.

$str_json_invalid = '{"post":"Tutoriel php","comment":"Comment utiliser PHP"}';
$arr = json_decode($str_json_invalid, true);
foreach ($arr as $key => $value) {
	echo $key . " : " . $value . "<br/>";
}

//Affichera le résultat : 
//post : Tutoriel php
//comment : Comment utiliser PHP

 

Comment échanger des données JSON entre PHP et AJAX ?

Consulter cette publication complémentaire qui répondra à vos questions concernant les échanges JSON avec AJAX et PHP en JQUERY.