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実行します。