在我最近参与的一个项目中,我们正在处理来自EXT JS前端应用程序的大型 JSON 数据结构。下面是 JSON 对象的一个示例(这只是 JSON 的骨架):
{
"presence_token":"734737328233HDHSBSHSYEYWYWGWE",
"presence_time":"HH:Mins:Secs",
“朋友请求”:
[
{
"来自":"用户名",
“类型”:“伙伴”,
"日期":"DD/MM/YY",
“时间”:“HH:分钟:秒”,
"name":"你的全名",
“电子邮件”:“用户@example.com”
}
],
“组状态”:
[
{
"group_name":"ecampus",
“状态”:“正在运行”,
“成员”:[“菲尔”,“乔希”,“沙兹”],
"start_date":"DD/MM/YY",
"start_time":"HH:Mins:Secs"
},
{
"group_name":"buganda",
“状态”:“关闭”
}
],
“朋友状态”:
[
{
"friend":"朋友_用户名",
“状态”:“在线”,
"log_on_time":"HH:Mins:Secs",
“状态”:“可用”,
"name":"Friend_Fullname",
“电子邮件”:“用户@example.com”
},
{
"friend":"朋友_用户名",
“状态”:“离线”,
"name":"Friend_Fullname",
“电子邮件”:“用户@example.com”
}
]
}
之后mochijson2:decode/1
,我拥有的结构对象如下所示:
{struct,[{<<"presence_token">>,
<<"734737328233HDHSBSHSYEYWYWGWE">>},
{<<"presence_time">>,<<"HH:Mins:Secs">>},
{<<"friend_requests">>,
[{struct,[{<<"来自">>,<<"用户名">>},
{<<"类型">>,<<"好友">>},
{<<"日期">>,<<"DD/MM/YY">>},
{<<"时间">>,<<"HH:Mins:Secs">>},
{<<"姓名">>,<<"你的全名">>},
{<<"email">>,<<"user@example.com">>}]}]},
{<<"组状态">>,
[{struct,[{<<"group_name">>,<<"ecampus">>},
{<<"状态">>,<<"运行">>},
{<<"members">>,[<<"phil">>,<<"josh">>,<<"shazz">>]},
{<<"开始日期">>,<<"DD/MM/YY">>},
{<<"start_time">>,<<"HH:Mins:Secs">>}]},
{struct,[{<<"group_name">>,<<"buganda">>},
{<<"状态">>,<<"关闭">>}]}]},
{<<"friend_status">>,
[{struct,[{<<"friend">>,<<"Friend_username">>},
{<<"状态">>,<<"在线">>},
{<<"log_on_time">>,<<"HH:Mins:Secs">>},
{<<"状态">>,<<"可用">>},
{<<"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,_}) -> 真;
is_struct(_) -> 错误。
to_binary(S) 当 is_list(S)-> list_to_binary(S);
to_binary(S) 当 is_integer(S)-> S;
to_binary(S) 当 is_atom(S)-> to_binary(atom_to_list(S));
to_binary(S) -> S。
to_value(V) 当 is_binary(V)-> binary_to_list(V);
to_value(V) 当 is_integer(V)-> V;
to_value(V) when is_list(V)->
尝试 list_to_integer(V) 的
聚丙烯 -> 聚丙烯
抓住
_:_ ->
尝试 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)->
[所有键(XX)|| XX <- LL];
to_value2(D) 当 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"},
{"time","HH:Mins:Secs"},
{"name","你的全名"},
{"email","user@example.com"}]]},
{“组状态”,
[[{"group_name","ecampus"},
{"状态","运行"},
{“成员”,[“菲尔”,“乔希”,“沙兹”]},
{"start_date","DD/MM/YY"},
{"start_time","HH:Mins:Secs"}],
[{"group_name","buganda"},{"status","off"}]]},
{“朋友状态”,
[[{"friend","Friend_username"},
{"状态","在线"},
{"log_on_time","HH:Mins:Secs"},
{“状态”,“可用”},
{"name","Friend_Fullname"},
{"email","user@example.com"}],
[{"friend","Friend_username"},
{"状态","离线"},
{"name","Friend_Fullname"},
{"email","user@example.com"}]]}]
上面的 proplist 比 struct 对象更容易使用。但是,您可能会发现 struct 模块的另一个版本,特别是在一个名为 Sticky Notes 的著名 mochiweb 示例中,我现在没有它的链接。我在上面粘贴的 struct 模块应该能够帮助您使用 mochijson2。成功