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),