JSON API で Erlang を使用するベスト プラクティスは何ですか? つまり、JSON - ロジック - データベース - ロジック - JSON ライフサイクルをどのように扱うのですか? Erlang アプリで使用しているデータ構造、ツール、テクニックは何ですか?
3 に答える
ErlangでJSONに使用する傾向のあるツールは2つあります:jsx
とjiffy
。柔軟性と速度の特性がわずかに異なるため、両方を確認してください。
主な問題は、Erlangに辞書タイプが組み込まれていないことです。したがって、JSONオブジェクトは、多くの場合、プロパティリストとして表されます。
{ a : 10,
b : 20 }
タプルのリストとして表されます。
[{a, 10}, {b, 20}]
そして、これは注意すべき主要なことです。また、長期的には扱いにくいため、内部表現形式としてJSONを使用することはできるだけ避ける必要があることも意味します。
JSON を操作するには、 mochijson2 とErlsonを使用します。
mochijson2
mochiwebプロジェクトの一部です。これは、柔軟な JSON 解析および生成 API を備えた、安定した、実戦でテスト済みの純粋な Erlang 実装です。
Erlsonは、JSON を扱うときに特に便利な Erlang 用の優れた辞書構文を提供します。例えば:
#[
foo = 1,
bar = "some string",
nested = #[i = 1, b = true]
]
さらに、Erlson には、を使用して Erlson と JSON の間で変換するためのerlson:to_json
および関数が付属しています。erlson:from_json
mochiweb2
(免責事項: 私は Erlson の著者です)
あなたの質問はこれまでに受け取った答えよりも大きいです。ただし、JSONの操作についてmochijson.erl
は、すべてHTTPライブラリmochijson2.erl
が付属していることを説明しています。mochiweb
それらを使用するために、JSONオブジェクトは次のStruct
ようなオブジェクトとして表されます。
JSON
{"FirstName": "Joshua"、 "Surname": "Muzaaya"}
In Erlang
{struct、[{<< "FirstName">>、<< "Joshua">>}、{<< "Surname"> >、<< "Muzaaya">>}]}
前後に解析するには:
JSON_DATA = {"students":[データベース、私はあなたが本当に何を望んでいるのかわかりませんが、通常、キーバリューストアに
{"student_number":45、
"details":[{"FirstName": "Joshua"、 "Surname": "Muzaaya"} ] } ]}
JSONからErlangへ
$>mochijson2:decode(JSON_DATA)。 {struct、[{<< "students">>、 [{struct、[{<< "student_number">>、45}、 {<< "詳細">>、 [{struct、[{<< "FirstName">>、<< "Joshua">>}、 {<< "Surname">>、<< "Muzaaya">>}]}]}]}]}]}
ErlangからJSONへ
$>mochijson2:encode(StructObject)。
Mnesia
、またはアクセスAPICouchDB
を介してデータを書き込むことができます。RESTFUL
私はCouchbase Single Server
Erlangでクライアントを作成しました。内部の関数の一部を次に示します。create_database(ServerDomain、DBName)-> {ok、_、_、Result}->の ibrowse:send_req(ServerDomain ++ DBName、[{"Content-Type"、
"application / json"}]、put、[])を試してください
case proplists:get_value(<< "ok">>、element(2、mochijson2:decode(Result
)))of 未定義->{エラー、失敗}; _->わかりました 終わり; Any-> {error、Any} キャッチ EE:EE2-> {エラー、{EE、EE2}} 終わり。
delete_database(ServerDomain、DBName)-> ibrowse:send_req(ServerDomain ++ DBName、[{"Content-Type"、 "application / json"}]、delete、[])を試してください {ok、_、_、Result}-> case proplists:get_value(<< "ok">>、element(2、mochijson2:decode(Result)))of 未定義->{エラー、失敗}; _->わかりました 終わり; Any-> {error、Any} キャッチ EE:EE2-> {エラー、{EE、EE2}} 終わり。
%% read / 3 :: = Struct
read(ServerDomain、DBName、DocId)->
{ok、_、_、Result} のibrowse:send_req(ServerDomain ++ DBName ++ "/" ++ DocId、[{"Content-Type"、 "application / json"}]、get、[])を試してください- > mochijson2:decode(Result);
Any-> {error、Any} キャッチ EE:EE2-> {エラー、{EE、EE2}} 終わり。
%% write / 3 :: = [{id、Id :: string()}、{rev、Rev :: string()}]
write(ServerDomain、DBName、DocStruct)-> ibrowse:send_req(ServerDomain ++ DBName、[{"Content-Type"、 "application / json"}]、post、lists:flatten(mochijson:encode(DocStruct)))を試してください
{ok、_、_、Result}-> E = element(2、mochijson2:decode(Result))、 ケース{proplists:get_value(<< "id">>、E)、proplists:get_value(<< "rev">>、E)}の {未定義、_}-> {エラー、E}; {_、undefined}-> {error、E}; {Id、Rev}-> [{id、binary_to_list(Id)}、{rev、binary_to_list(Rev)}]
end;
Any-> {error、Any} キャッチ EE:EE2-> {エラー、{EE、EE2}} 終わり。
%%更新するときは、最近のコピーの「_rev」を指定することを忘れないでください %% update / 4 :: = [{id、Id :: string()}、{rev、Rev :: string()}] update(ServerDomain、DBName、DocId、DocStruct)-> try ibrowse:send_req(ServerDomain ++ DBName ++ "/" ++ DocId、[{"Content-Type"、 "application / json"}]、put、lists:flatten(mochijson:encode(DocStruct)))of
{ok、_、_、Result}-> E = element(2、mochijson2:decode(Result))、 ケース{proplists:get_value(<< "id">>、E)、proplists:get_value(<< "rev">>、E)}の {未定義、_}-> {エラー、E}; {_、undefined}-> {error、E}; {Id、Rev}-> [{id、binary_to_list(Id)}、{rev、binary_to_list(Rev)}]
end;
Any-> {error、Any} キャッチ EE:EE2-> {エラー、{EE、EE2}} 終わり。
%%現在のコピーの「_rev」を指定する必要があります 削除するドキュメントの%%
delete(ServerDomain、DBName、DocId、Rev)-> ibrowse:send_req(ServerDomain ++ DBName ++ "/" ++ DocId ++ "?rev =" ++ Rev、[{"Content-Type"、 "application / json"}]、delete、[])を試してください
{ok、_、_、Result}-> E = element(2、mochijson2:decode(Result))、 ケース{proplists:get_value(<< "id">>、E)、proplists:get_value(<< "ok">>、E)}の {未定義、_}-> {エラー、E}; {_、undefined}-> {error、E}; {_Id、_}-> ok
end;
Any-> {error、Any} キャッチ EE:EE2-> {エラー、{EE、EE2}} 終わり。
is_integer(Count)->の場合のrandom(ServerDomain、Count) ibrowse:send_req(ServerDomain ++ "_uuids?count =" ++ integer_to_list(Count)、[{"Content-Type"、 "application / json"}]、get、[])を試してください {ok、_、_、Result}-> [binary_to_list(Z)|| Z <-proplists:get_value(<< "uuids">>、element(2、mochijson2:decode(Result)))]; Any-> {error、Any} キャッチ EE:EE2-> {エラー、{EE、EE2}} 終わり。
だから、おそらくあなたの質問を分解してみてください。それ以外の場合は、JSONでたくさん遊んでいることがわかります。メソッドabpveを使用するには、最初にmakeuserをibrowse
実行します。