在 JSON API 中使用 Erlang 的最佳实践是什么?我的意思是你如何处理 JSON - 逻辑 - 数据库 - 逻辑 - JSON 生命周期。你在 Erlang 应用程序中使用了哪些数据结构、工具和技术?
3 回答
我倾向于在 Erlang 中为 JSON 使用两种工具:jsx
和jiffy
. 检查它们,因为它们的灵活性和速度略有不同。
主要问题是 Erlang 没有内置的字典类型。因此,JSON 对象通常表示为一个属性列表,即
{ a : 10,
b : 20 }
表示为元组列表:
[{a, 10}, {b, 20}]
这是需要注意的主要问题。这也意味着人们应该尽可能避免使用 JSON 作为内部表示格式,因为从长远来看它很难使用。
为了使用 JSON,我使用 mochijson2 和Erlson。
mochijson2
是mochiweb项目的一部分。它是一个稳定的、久经考验的纯 Erlang 实现,具有灵活的 JSON 解析和生成 API。
Erlson为 Erlang 提供了一个很好的字典语法,这在使用 JSON 时特别方便。例如:
#[
foo = 1,
bar = "some string",
nested = #[i = 1, b = true]
]
此外,Erlson 还带有用于在 Erlson 和 JSON 之间转换erlson:to_json
的函数。erlson:from_json
mochiweb2
(免责声明:我是 Erlson 的作者)
您的问题比迄今为止收到的答案要大。但是,对于操纵 JSON,他们都告诉过你mochijson.erl
,mochijson2.erl
所有这些都带有mochiweb
HTTP 库。要使用它们,JSON 对象表示为这样的Struct
对象:
在 JSON
{"FirstName": "Joshua", "Surname": "Muzaaya"}
在 Erlang
{struct,[{<<"FirstName">>,<<"Joshua">>},{<<"Surname"> >,<<"穆萨亚">>}]}
来回解析:
JSON_DATA = {"students":[现在数据库,我不知道你真正想要什么,但是,通常,我们可以在键值存储中写入数据
{"student_number":45,
"details":[{"FirstName": "Joshua", "Surname": "Muzaaya"} ] } ]}
从 JSON 到 Erlang
$> mochijson2:decode(JSON_DATA)。 {结构,[{<<“学生”>>, [{结构,[{<<“学生编号”>>,45}, {<<“详情”>>, [{struct,[{<<"FirstName">>,<<"Joshua">>}, {<<"Surname">>,<<"Muzaaya">>}]}]}]}]}]}
从 Erlang 到 JSON
$> mochijson2:encode(StructObject)。
Mnesia
,或者CouchDB
通过RESTFUL
访问 API。我用Couchbase Single Server
Erlang 写了一个客户端。下面是里面的一些函数:create_database(ServerDomain,DBName)-> 尝试 ibrowse:send_req(ServerDomain ++ DBName,[{"Content-Type",
"application/json"}],put,[]) of
{ok,_,_,Result} -> case proplists:get_value(<<"ok">>,element(2,mochijson2:decode(Result
))) 的 未定义-> {错误,失败}; _ -> 好的 结尾; 任何 -> {错误,任何} 抓住 EE:EE2 -> {错误,{EE,EE2}} 结尾。
delete_database(ServerDomain,DBName)-> 尝试 ibrowse:send_req(ServerDomain ++ DBName,[{"Content-Type","application/json"}],delete,[]) 的 {ok,_,_,结果} -> case proplists:get_value(<<"ok">>,element(2,mochijson2:decode(Result))) 的 未定义-> {错误,失败}; _ -> 好的 结尾; 任何 -> {错误,任何} 抓住 EE:EE2 -> {错误,{EE,EE2}} 结尾。
%% 读取/3 ::= 结构
读取(ServerDomain,DBName,DocId)-> 尝试 ibrowse:send_req(ServerDomain ++ DBName ++ "/" ++ DocId,[{"Content-Type","application/json"}],get,[]) of
{ok,_,_,Result} - > mochijson2:解码(结果);
任何 -> {错误,任何} 抓住 EE:EE2 -> {错误,{EE,EE2}} 结尾。
%% 写入/3 ::= [{id,Id::string()},{rev,Rev::string()}]
写入(ServerDomain,DBName,DocStruct)-> 尝试 ibrowse:send_req(ServerDomain ++ DBName,[{"Content-Type","application/json"}],post,lists:flatten(mochijson:encode(DocStruct))) 的
{ok,_,_,结果} -> E = 元素(2,mochijson2:解码(结果)), 案例 {proplists:get_value(<<"id">>,E),proplists:get_value(<<"rev">>,E)} 的 {未定义,_} -> {错误,E}; {_,undefined} -> {错误,E}; {Id,Rev} -> [{id,binary_to_list(Id)},{rev,binary_to_list(Rev)}]
结束;
任何 -> {错误,任何} 抓住 EE:EE2 -> {错误,{EE,EE2}} 结尾。
%% 记得在更新时指定最近副本的'_rev' %% 更新/4 ::= [{id,Id::string()},{rev,Rev::string()}] 更新(服务器域、数据库名称、DocId、DocStruct)-> 尝试 ibrowse:send_req(ServerDomain ++ DBName ++ "/" ++ DocId,[{"Content-Type","application/json"}],put,lists:flatten(mochijson:encode(DocStruct))) 的
{ok,_,_,结果} -> E = 元素(2,mochijson2:解码(结果)), 案例 {proplists:get_value(<<"id">>,E),proplists:get_value(<<"rev">>,E)} 的 {未定义,_} -> {错误,E}; {_,undefined} -> {错误,E}; {Id,Rev} -> [{id,binary_to_list(Id)},{rev,binary_to_list(Rev)}]
结束;
任何 -> {错误,任何} 抓住 EE:EE2 -> {错误,{EE,EE2}} 结尾。
%% 您需要提供当前副本的“_rev” %% 要删除的文档
delete(ServerDomain,DBName,DocId,Rev)-> 尝试 ibrowse:send_req(ServerDomain ++ DBName ++ "/" ++ DocId ++ "?rev=" ++ Rev,[{"Content-Type","application/json"}],delete,[]) 的
{ok,_,_,结果} -> E = 元素(2,mochijson2:解码(结果)), 案例 {proplists:get_value(<<"id">>,E),proplists:get_value(<<"ok">>,E)} 的 {未定义,_} -> {错误,E}; {_,undefined} -> {错误,E}; {_Id,_} -> 好的
结束;
任何 -> {错误,任何} 抓住 EE:EE2 -> {错误,{EE,EE2}} 结尾。
随机(ServerDomain,Count)当is_integer(Count)-> 尝试 ibrowse:send_req(ServerDomain ++ "_uuids?count=" ++ integer_to_list(Count),[{"Content-Type","application/json"}],get,[]) 的 {ok,_,_,结果} -> [binary_to_list(Z) || Z <- proplists:get_value(<<"uuids">>,element(2,mochijson2:decode(Result)))]; 任何 -> {错误,任何} 抓住 EE:EE2 -> {错误,{EE,EE2}} 结尾。
所以,也许试着分解你的问题。否则,您可以在上面看到我在玩 JSON。要使用 abpve 方法,首先使用户处于ibrowse
运行状态。