Création de sites web en éco-conception

07/04/2013 Décoder du JSON envoyé en AJAX

Il est très simple d'envoyer du JSON en Ajax. Exemple avec jQuery :

jQuery.ajax({ type:'POST', data: {"library":{"name": "Bibliothèque du Nord", "content": {"DVD" : [ ], "books":[{ "title": "Madame Bovary", "author": "Flaubert" },{ "title": "Une histoire sans nom", "author": "Barbey d'Aurevilly" }]}}}, ...

Du côté serveur, la variable $_POST["data"] est une chaîne de caractères (l'objet sérialisé) au format UTF8.

Si l'on souhaite la traiter sans UTF8 et sous forme de tableau, on utilisera deux fonctions PHP prévues à cet effet : utf8_decode(string) et json_decode(string).

Sachant que la fonction json_decode requiert comme argument une chaîne de caractères au format UTF8 (cf doc "Cette fonction ne traite qu'avec des données encodées avec UTF-8."), il nous faut d'abord décoder le JSON puis convertir l'UTF8.

$_POST["data"]=json_decode( $_POST["data"], true /* retourne un tableau associatif */ );

et ensuite ... $_POST["data"]=utf8_decode($_POST["data"]); ?

Sûrement pas ! $_POST["data"] est à présent un tableau alors que la fonction utf8_decode exige un string...

On est obligé de se rabattre sur array_walk, sauf que ... notre tableau est multidimensionnel !

Heureusement, la fonction array_walk_recursive fait l'affaire.

Si - en guise de fonction de rappel - on utilise une fonction anonyme, l'instruction devient simplissime :

array_walk_recursive( json_decode($_POST["data"],true), function (&$value) { $value=utf8_decode($value); } );

Inspiré de http://stackoverflow.com/questions/4897603/php-json-decode-something-not-display.

Commentaires

Ajouter un commentaire :