erlang 下边的json 库用过几个,今天发现了ej库,解析和生成都很方便,下边是使用说明,里边详细的用法看里边的例子就可以了,这里给出的是为什么这么用,里边数据是怎么生成的。
1. ej 库下载地址是:
https://codeload.github.com/seth/ej/zip/master
2. 使用说明
% menu.json file
%{"menu": {
%"id": "file",
%"value": "File",
%"popup": {
%"menuitem": [
%{"value": "New", "onclick": "CreateNewDoc()"},
%{"value": "Open", "onclick": "OpenDoc()"},
%{"value": "Close", "onclick": "CloseDoc()"}
%]
%}
%}}
% menu.terms
%{struct,
%[{<<"menu">>,
%{struct,
%[{<<"id">>,<<"file">>},
%{<<"value">>,<<"File">>},
%{<<"popup">>,
%{struct,
%[{<<"menuitem">>,
%[{struct,
%[{<<"value">>,<<"New">>},
%{<<"onclick">>,<<"CreateNewDoc()">>}]},
%{struct,
%[{<<"value">>,<<"Open">>},
%{<<"onclick">>,<<"OpenDoc()">>}]},
%{struct,
%[{<<"value">>,<<"Close">>},
%{<<"onclick">>,<<"CloseDoc()">>}]}]}]}}]}}]}.
% menu.alt_terms
%{[{<<"menu">>,
%{[{<<"id">>,<<"file">>},
%{<<"value">>,<<"File">>},
%{<<"popup">>,
%{[{<<"menuitem">>,
%[{[{<<"value">>,<<"New">>},{<<"onclick">>,<<"CreateNewDoc()">>}]},
%{[{<<"value">>,<<"Open">>},{<<"onclick">>,<<"OpenDoc()">>}]},
%{[{<<"value">>,<<"Close">>},
%{<<"onclick">>,<<"CloseDoc()">>}]}]}]}}]}}]}.
% 产生测试数据
make_terms(JsonFile) ->
{ok, Json} = file:read_file(JsonFile),
Base = filename:basename(JsonFile),
Decoder = mochijson2:decoder([{object_hook, fun({struct,L}) -> {L} end}]),
AltTerms = Decoder(Json),
Terms = mochijson2:decode(Json),
file:write_file(Base ++ ".terms", io_lib:format("~p.~n", [Terms])),
file:write_file(Base ++ ".alt_terms", io_lib:format("~p.~n", [AltTerms])).
getwid()->
{[{<<"widget">>,
{[{<<"version">>,<<"1">>},
{<<"values">>,[1,2,3,4,5]},
{<<"debug">>,<<"on">>},
{<<"window">>,
{[{<<"title">>,<<"Sample Konfabulator Widget">>},
{<<"name">>,<<"main_window">>},
{<<"width">>,500},
{<<"height">>,500}]}},
{<<"image">>,
{[{<<"src">>,<<"Images/Sun.png">>},
{<<"name">>,<<"sun1">>},
{<<"hOffset">>,250},
{<<"vOffset">>,250},
{<<"alignment">>,<<"center">>}]}},
{<<"text">>,
{[{<<"data">>,<<"Click Here">>},
{<<"size">>,36},
{<<"style">>,<<"bold">>},
{<<"name">>,<<"text1">>},
{<<"hOffset">>,250},
{<<"vOffset">>,100},
{<<"alignment">>,<<"center">>},
{<<"onMouseUp">>,
<<"sun1.opacity = (sun1.opacity / 100) * 90;">>}]}}]}}]}.
getmenu()->
{[{<<"menu">>,
{[{<<"id">>,<<"file">>},
{<<"value">>,<<"File">>},
{<<"popup">>,
{[{<<"menuitem">>,
[{[{<<"value">>,<<"New">>},{<<"onclick">>,<<"CreateNewDoc()">>}]},
{[{<<"value">>,<<"Open">>},{<<"onclick">>,<<"OpenDoc()">>}]},
{[{<<"value">>,<<"Close">>},
{<<"onclick">>,<<"CloseDoc()">>}]}]}]}}]}}]}.
test()->
Wid = getwid(),
{ok, [Widget]} = file:consult("/home/yangzm/tmp/widget.alt_terms"),
Ret = ej:get({"widget", "version"}, Wid),