最近取り組んだプロジェクトでは、EXT JSフロントエンド アプリからの大きな JSON データ構造を扱っていました。JSON オブジェクトの一例を以下に示します (これは単なる JSON のスケルトンです)。
{
"presence_token":"734737328233HDHSBSHSYEYEYWYWGWE",
"presence_time":"HH:分:秒",
"friend_requests":
[
{
"from":"ユーザー名",
"タイプ":"バディ",
"日付":"DD/MM/YY",
"時間":"HH:分:秒",
"name":"あなたのフルネーム",
"メール":"user@example.com"
}
]、
"group_status":
[
{
"group_name":"ecampus",
"ステータス":"実行中",
"メンバー":["フィル","ジョシュ","シャズ"],
"開始日":"DD/MM/YY",
"start_time":"HH:分:秒"
}、
{
"group_name":"ブガンダ",
「ステータス」:「オフ」
}
]、
"friend_status":
[
{
"friend":"Friend_username",
"ステータス":"オンライン",
"log_on_time":"HH:分:秒",
"状態":"利用可能",
"name":"Friend_Fullname",
"メール":"user@example.com"
}、
{
"friend":"Friend_username",
"ステータス":"オフライン",
"name":"Friend_Fullname",
"メール":"user@example.com"
}
]
}
の後mochijson2:decode/1
、私が持っていた構造体オブジェクトは次のように表示されます:
{struct,[{<<"presence_token">>,
<<"734737328233HDHSBSHSYEYEYWYWGWE">>}、
{<<"存在時間">>、<<"HH:分:秒">>}、
{<<"friend_requests">>、
[{struct,[{<<"from">>,<<"ユーザー名">>},
{<<"タイプ">>、<<"バディ">>}、
{<<"日付">>,<<"DD/MM/YY">>},
{<<"時間">>,<<"HH:分:秒">>},
{<<"名前">>、<<"あなたのフルネーム">>}、
{<<"email">>,<<"user@example.com">>}]}]},
{<<"group_status">>、
[{struct,[{<<"group_name">>,<<"ecampus">>},
{<<"ステータス">>、<<"実行中">>}、
{<<"メンバー">>,[<<"フィル">>,<<"ジョシュ">>,<<"シャズ">>]},
{<<"開始日">>,<<"DD/MM/YY">>},
{<<"start_time">>,<<"HH:分:秒">>}]},
{struct,[{<<"group_name">>,<<"buganda">>},
{<<"ステータス">>,<<"オフ">>}]}]},
{<<"friend_status">>、
[{struct,[{<<"friend">>,<<"Friend_username">>},
{<<"状態">>,<<"オンライン">>},
{<<"ログオン時間">>,<<"HH:分:秒">>},
{<<"状態">>、<<"利用可能">>}、
{<<"name">>,<<"Friend_Fullname">>},
{<<"email">>,<<"user@example.com">>}]},
{struct,[{<<"friend">>,<<"Friend_username">>},
{<<"状態">>,<<"オフライン">>},
{<<"name">>,<<"Friend_Fullname">>},
{<<"email">>,<<"user@example.com">>}]}]}]}
ここで、この構造体を「深い」proplist に変換するモジュールを作成することにしました。このモジュールにはstruct:all_keys/1
、構造体オブジェクトを渡すとリストとタプルを整理された方法で生成する関数が含まれます。コードは次のとおりです。
-モジュール(構造体)。
-export([all_keys/1])。
is_struct({struct,_}) -> true;
is_struct(_) -> false。
to_binary(S) when is_list(S)-> list_to_binary(S);
to_binary(S) when is_integer(S)-> S;
to_binary(S) when is_atom(S)-> to_binary(atom_to_list(S));
to_binary(S) -> S.
to_value(V) when is_binary(V)-> binary_to_list(V);
to_value(V) when is_integer(V)-> V;
to_value(V) の場合 is_list(V)->
の list_to_integer(V) を試してください
PP -> PP
キャッチ
_:_ ->
list_to_float(V) を試す
PP2 -> PP2
キャッチ
_:_ -> V
終わり
終わり;
to_value(A)-> A.
to_value2({struct,L})->
all_keys({struct,L});
to_value2([{struct,_L}|_Rest] = LL)->
[all_keys(XX) || XX <- LL];
to_value2(D) when is_binary(D)-> to_value(D);
to_value2(D) の場合 is_list(D)->
[to_value2(任意) || 任意 <- D]。
all_keys({struct,L})->
[{to_value(Key),to_value2(Val)} || {キー、ヴァル} <- L];
all_keys(リスト)-> [all_keys(X) || X <-リスト]。
今、呼び出すと、次のstruct:all_keys(Struct_object)
出力が得られます。
[{"presence_token",P_token},
{"presence_time",P_time},
{"friend_requests",
[[{"差出人","ユーザー名"},
{"タイプ","仲間"},
{"日付","DD/MM/YY"},
{"時間","HH:分:秒"},
{"name","あなたのフルネーム"},
{"email","user@example.com"}]]},
{"group_status",
[[{"group_name","ecampus"},
{"ステータス","実行中"},
{"メンバー",["フィル","ジョシュ","シャズ"]},
{"開始日","DD/MM/YY"},
{"start_time","HH:Mins:Secs"}],
[{"group_name","buganda"},{"status","off"}]]},
{"friend_status",
[[{"フレンド","フレンド_ユーザー名"},
{"ステータス","オンライン"},
{"ログオン時間","HH:分:秒"},
{"状態","利用可能"},
{"name","Friend_Fullname"},
{"email","user@example.com"}],
[{"フレンド","フレンド_ユーザー名"},
{"ステータス","オフライン"},
{"name","Friend_Fullname"},
{"email","user@example.com"}]]}]
上記の proplist は、struct オブジェクトよりも簡単に操作できます。ただし、構造体モジュールの別のバージョンが、特に有名な mochiweb の例 (Sticky Notes と呼ばれる) で見つかる場合があります。そのリンクは今のところありません。上に貼り付けた構造体モジュールは、mochijson2 の使用に役立つはずです。成功