3

JSON API で Erlang を使用するベスト プラクティスは何ですか? つまり、JSON - ロジック - データベース - ロジック - JSON ライフサイクルをどのように扱うのですか? Erlang アプリで使用しているデータ構造、ツール、テクニックは何ですか?

4

3 に答える 3

7

ErlangでJSONに使用する傾向のあるツールは2つあります:jsxjiffy。柔軟性と速度の特性がわずかに異なるため、両方を確認してください。

主な問題は、Erlangに辞書タイプが組み込まれていないことです。したがって、JSONオブジェクトは、多くの場合、プロパティリストとして表されます。

{ a : 10,
  b : 20 }

タプルのリストとして表されます。

[{a, 10}, {b, 20}]

そして、これは注意すべき主要なことです。また、長期的には扱いにくいため、内部表現形式としてJSONを使用することはできるだけ避ける必要があることも意味します。

于 2012-11-12T15:33:44.280 に答える
5

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 の著者です)

于 2012-11-12T19:33:26.477 に答える
1

あなたの質問はこれまでに受け取った答えよりも大きいです。ただし、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実行します。

于 2012-11-13T09:13:31.830 に答える