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を使用します。
mochijson2mochiwebプロジェクトの一部です。これは、柔軟な JSON 解析および生成 API を備えた、安定した、実戦でテスト済みの純粋な Erlang 実装です。
Erlsonは、JSON を扱うときに特に便利な Erlang 用の優れた辞書構文を提供します。例えば:
#[
foo = 1,
bar = "some string",
nested = #[i = 1, b = true]
]
さらに、Erlson には、を使用して Erlson と JSON の間で変換するためのerlson:to_jsonおよび関数が付属しています。erlson:from_jsonmochiweb2
(免責事項: 私は 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 ServerErlangでクライアントを作成しました。内部の関数の一部を次に示します。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実行します。