Comment utiliser mochijson pour coder la structure de données en Erlang?
Question
J'utilise mochiweb et je ne sais pas comment utiliser son encodeur JSON pour faire face à la structure de données complexes. Quelle est la différence entre mochijson et mochijson2? Y at-il un bon exemple? Je reçois toujours les erreurs suivantes:
46> T6={struct,[{hello,"asdf"},{from,"1"},{to,{a,"aa"}}]}.
{struct,[{hello,"asdf"},{from,"1"},{to,{a,"aa"}}]}
47> mochijson2:encode(T6).
** exception exit: {json_encode,{bad_term,{a,"aa"}}}
in function mochijson2:json_encode/2
in call from mochijson2:'-json_encode_proplist/2-fun-0-'/3
in call from lists:foldl/3
in call from mochijson2:json_encode_proplist/2
39> T3={struct,[{hello,"asdf"},{[{from,"1"},{to,"2"}]}]}.
{struct,[{hello,"asdf"},{[{from,"1"},{to,"2"}]}]}
40> mochijson:encode(T3).
** exception error: no function clause matching mochijson:'-json_encode_proplist/2-fun-0-'({[{from,"1"},{to,"2"}]},
[44,"\"asdf\"",58,"\"hello\"",123],
{encoder,unicode,null})
in function lists:foldl/3
in call from mochijson:json_encode_proplist/2
La solution
mochijson2 fonctionne avec des chaînes sous forme de binaires, listes sous forme de tableaux, et ne décode que UTF-8. mochijson décode et code pour les points de code Unicode.
Pour créer une structure profonde, je l'ai fait ce qui suit:
2> L = {struct, [{key2, [192]}]}.
{struct,[{key2,"?"}]}
3>
3> L2 = {struct, [{key, L}]}.
{struct,[{key,{struct,[{key2,"?"}]}}]}
4>
4> mochijson:encode(L2).
[123,"\"key\"",58,
[123,"\"key2\"",58,[34,"\\u00c0",34],125],
125]
Donc, si vous créez récursive votre structure de données à l'aide des listes alors vous serez très bien. Je ne sais pas pourquoi struct profondes ne sont pas pris en charge, mais ils ne semblent pas être, au moins pas la façon dont vous essayez de les créer. Peut-être que quelqu'un d'autre connaît un moyen plus intelligent de le faire.
Vous pouvez également consulter ce fil: mochijson2 exemples
ou
Tutoriel vidéo pour commencer à développer des applications Web sur Erlang
Autres conseils
T6={struct, [{hello,"asdf"},{from,"1"},{to, {a,"aa"}} ]}.
devrait plutôt être:
T6={struct, [{hello,"asdf"},{from,"1"},{to, {struct, [{a,"aa"}]}} ]}.
Les structures imbriquées doivent avoir le même style « struct » comme objet de niveau supérieur.