Jul/090
Utilisation de structures pour JSON
Jusqu’à présent, les données renvoyées étaient fournies sous forme d’un flux final de caractères :
handle_http(Req, {'GET', json}, _) -> ercm_ctx:return_json_data(Req, "{title:'Test',content:'Data loaded from server'}").
On doit pouvoir construire la structure JSON de façon dynamique et efficace. Pour cela, il faudra créer les structures attendues par le module mochijson2
.
Ce module permet de renvoyer un flux JSON via la méthode encode/1
. La méthode attend en paramètre (voir la documentation de Mochiweb) un json_object()
. Cet objet est défini ainsi :
{struct, [{json_string(), json_term()}]}
json_term()
permet une définition récursive. Ce qui nous intéresse est le json_string()
qui est représenté soit par un atome, soit par un binaire.
Ce qui fait que le flux JSON précédent peut s’écrire de cette façon :
{struct, [{<<"title">>,<<"Test">>},{<<"content">>,<<"Data">>}]}
Cette notation étrange est celle des binaires. On pourrait utiliser des atomes pour les clés comme ci dessous, mais le fait qu’il y ait un nombre limité d’éléments fait que ce n’est pas une bonne idée :
{struct, [{title,<<"Test">>},{content,<<"Data">>}]}
Pour que ce flux puisse être renvoyé, il doit être encodé :
handle_http(Req, {'GET', json}, _) -> Json = {struct, [{<<"title">>,<<"Test">>},{<<"content">>,<<"Data">>}]}, Result = mochijson2:encode(Json), ercm_ctx:return_json_data(Req, Result).
On peut alors simplifier les traitements en modifiant légèrement la fonction return_json_data/2
comme suit (chaque fonction est dans un fichier différent) :
return_json_data(Req, Data) -> Json = {struct, Data}, Result = mochijson2:encode(Json), Req:ok({"application/json", [], Result}). handle_http(Req, {'GET', json}, _) -> Json = [{<<"title">>, <<"Test">>}, {<<"content">>, <<"Data">>}], ercm_ctx:return_json_data(Req, Json).
C’est tout (mais comme j’ai du temps en ce moment, j’en profite…).
Sources : http://github.com/rv/ercm/tree/blog04.