Le format JSON, AJAX et jQuery Eval, chaînes JSON et parsing natif

 

Récupérer une chaîne de texte en JSON pour constituer un objet

 

La puissance de JSON provient du fait que l'on peut récupérer une chaîne de texte ou un fichier dans ce format pour l'exploiter directement avec la fonction eval() de JavaScript afin de constituer un objet. On peut alors s'adresser directement aux propriétés membres de cet objet (et de ses sous-membres) sans avoir à écrire d'autres fonctions d'analyse du texte.

Dans l'exemple suivant, on suppose que la chaîne de caractères textjson contient du code JSON récupéré via un fichier intermédiaire ou via le retour d'un appel AJAX grâce à XMLHttpRequest.
 

var textejson = '{"kiwis": 3, "url": "http://www.alsacreations.com"}';
var objet = eval('(' + textejson + ')');
console.log(objet);

 

Ne divulguez pas d'informations sensibles pour se protéger des attaques.

Dans l'absolu, on considère qu'il est plus sain de mettre en œuvre un parseur JSON spécifique plutôt qu'eval, si l'on ne fait pas absolument confiance à la source délivrant du JSON, étant donné que tout code JavaScript pourrait être interprété, éventuellement malicieusement. La plupart des navigateurs récents intègrent ce type de fonctionnalité avec une interface d'encodage/décodage :

 Mozilla Firefox 3.5+,
 Microsoft Internet Explorer 8+,
 Google Chrome et Safari grâce à Webkit,
 Opera 10.5+.

On trouve aussi des librairies JavaScript telle que Json-sans-eval qui sont moins performantes. Les frameworks jQuery, Dojo, Prototype, Mootols, Yahoo!UI font automatiquement appel à la librairie native si celle-ci est présente.
 

var textejson = '{"kiwis": 3, "url": "http://www.alsacreations.com"}';
var courses = JSON.parse(textejson);
console.log(courses);

 

 

Créer une chaîne de texte JSON à partir d'une structure de données


 

De la même façon, on peut effectuer l'opération inverse et créer une chaîne de texte JSON à partir d'une structure de données JavaScript (tableau, liste de valeurs, etc).
 

var textejson = JSON.stringify({"kiwis":3,"mangues":4})
console.log(textejson);

 

Pour détecter la présence de cette interface JSON :
 

 if(typeof JSON!="undefined") // OK


Soyez bien prudents et ne divulguez pas d'informations sensibles par ce biais. Comme indiqué, les navigateurs ont toujours toléré les appels inter-domaines sans respecter d'obligation de provenance pour la balise <script>, ce qui peut être la source d'attaques de type CSRF (ou XSRF). Les données sont alors divulguées à une page tiers qui peut les exploiter de n'importe quelle façon, notamment si un utilisateur est identifié sur un site et que des informations de session (identifiants, mot de passe) y sont véhiculées en clair.