在最近的一个项目香港专业教育学院的工作,我们都处理来自EXT JS前端应用程序的大JSON数据结构。JSON对象的一个例子是这里的下方(这是JSON的只是骨架):
{
"presence_token":"734737328233HDHSBSHSYEYEYWYWGWE",
"presence_time":"HH:Mins:Secs",
"friend_requests":
[
{
"from":"Username",
"type":"buddy",
"date":"DD/MM/YY",
"time":"HH:Mins:Secs",
"name":"Your Full name",
"email":"[email protected]"
}
],
"group_status":
[
{
"group_name":"ecampus",
"status":"running",
"members":["phil","josh","shazz"],
"start_date":"DD/MM/YY",
"start_time":"HH:Mins:Secs"
},
{
"group_name":"buganda",
"status":"off"
}
],
"friend_status":
[
{
"friend":"Friend_username",
"status":"online",
"log_on_time":"HH:Mins:Secs",
"state":"available",
"name":"Friend_Fullname",
"email":"[email protected]"
},
{
"friend":"Friend_username",
"status":"offline",
"name":"Friend_Fullname",
"email":"[email protected]"
}
]
}
后mochijson2:decode/1
,该结构物我有看起来像这样:
{struct,[{<<"presence_token">>,
<<"734737328233HDHSBSHSYEYEYWYWGWE">>},
{<<"presence_time">>,<<"HH:Mins:Secs">>},
{<<"friend_requests">>,
[{struct,[{<<"from">>,<<"Username">>},
{<<"type">>,<<"buddy">>},
{<<"date">>,<<"DD/MM/YY">>},
{<<"time">>,<<"HH:Mins:Secs">>},
{<<"name">>,<<"Your Full name">>},
{<<"email">>,<<"[email protected]">>}]}]},
{<<"group_status">>,
[{struct,[{<<"group_name">>,<<"ecampus">>},
{<<"status">>,<<"running">>},
{<<"members">>,[<<"phil">>,<<"josh">>,<<"shazz">>]},
{<<"start_date">>,<<"DD/MM/YY">>},
{<<"start_time">>,<<"HH:Mins:Secs">>}]},
{struct,[{<<"group_name">>,<<"buganda">>},
{<<"status">>,<<"off">>}]}]},
{<<"friend_status">>,
[{struct,[{<<"friend">>,<<"Friend_username">>},
{<<"status">>,<<"online">>},
{<<"log_on_time">>,<<"HH:Mins:Secs">>},
{<<"state">>,<<"available">>},
{<<"name">>,<<"Friend_Fullname">>},
{<<"email">>,<<"[email protected]">>}]},
{struct,[{<<"friend">>,<<"Friend_username">>},
{<<"status">>,<<"offline">>},
{<<"name">>,<<"Friend_Fullname">>},
{<<"email">>,<<"[email protected]">>}]}]}]}
现在我决定创建一个模块将这个结构转换为一个“深”的proplist,这个模块将包含一个函数struct:all_keys/1
,如果我给它提供结构对象,它会以有组织的方式生成列表和元组。下面是代码:
-module(struct).
-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) when is_list(V)->
try list_to_integer(V) of
PP -> PP
catch
_:_ ->
try list_to_float(V) of
PP2 -> PP2
catch
_:_ -> V
end
end;
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) when is_list(D)->
[to_value2(Any) || Any <- D].
all_keys({struct,L})->
[{to_value(Key),to_value2(Val)} || {Key,Val} <- L];
all_keys(List)-> [all_keys(X) || X <- List].
现在,调用struct:all_keys(Struct_object)
会给这个输出:
[{"presence_token",P_token},
{"presence_time",P_time},
{"friend_requests",
[[{"from","Username"},
{"type","buddy"},
{"date","DD/MM/YY"},
{"time","HH:Mins:Secs"},
{"name","Your Full name"},
{"email","[email protected]"}]]},
{"group_status",
[[{"group_name","ecampus"},
{"status","running"},
{"members",["phil","josh","shazz"]},
{"start_date","DD/MM/YY"},
{"start_time","HH:Mins:Secs"}],
[{"group_name","buganda"},{"status","off"}]]},
{"friend_status",
[[{"friend","Friend_username"},
{"status","online"},
{"log_on_time","HH:Mins:Secs"},
{"state","available"},
{"name","Friend_Fullname"},
{"email","[email protected]"}],
[{"friend","Friend_username"},
{"status","offline"},
{"name","Friend_Fullname"},
{"email","[email protected]"}]]}]
以上proplist这样更容易与工作比结构对象。但是,您可能会发现另一个版本的结构模块,特别是在着名的mochiweb示例中,这个示例名为粘滞便笺,其链接我现在没有。上面粘贴的结构模块应该能够帮助您使用mochijson2。 成功
你能发布一个实际的例子时间表,显示你的问题? – DefLog 2011-06-10 18:20:20