如何在erlang中将元组列表转换为二进制

时间:2015-10-05 05:23:56

标签: list binary erlang

假设我有

Message = [{"from_email",From_Email},{"name",Name},{"text",Text}],
To=[{"to_email",ToMail},{"to_name",ToName}],
Send_Mail=[{"to",To},{"subject",Subject},{"message",Message},{"from_email",From_Email},{"from_name",From_Name}].

我想将Send_Mail转换为二进制文件以解析为jason格式。我使用jsx进行解析,jsx使用二进制输入。

2 个答案:

答案 0 :(得分:3)

快速强制方法:迭代列表,递归输入元组和列表,将所有类似字符串的列表转换为二进制文件。

%% First exclude things that should be left alone:
list_to_jsx(E) when is_integer(E); is_float(E); is_atom(E); is_binary(E) -> E;

%% If converting a list, see if it can be made neatly into a 
%% binary, if so, done, if not recurse into the list.
list_to_jsx(L) when is_list(L) ->
    case catch list_to_binary(L) of
        B when is_binary(B) -> B;
        _ -> [convert(E) || E <- L]
    end;

%% If converting a tuple, convert each element:
list_to_jsx(T) when is_tuple(T) ->
    list_to_tuple([convert(E) || E <- tuple_to_list(T)]).

如果您确信输入列表中只显示了2元组,则最后一个子句可以略微简化为

list_to_jsx({F,V}) -> {convert(F),convert(V)}.

答案 1 :(得分:1)

JSX具有encode函数来将Erlang术语编码为JSON。但请注意,键应该是原子(from_email没有引号或单引号)或二进制(<<"from_email">>),而不是Erlang字符串。如果你以某种方式坚持使用你的表单,你可以将键(和必要的值)转换为二进制文件

[{list_to_binary(Key), if is_list(Value) -> list_to_binary(Value); true -> Value end} || {Key, Value} <- ListOfTuples]

如果值本身可以是JSON对象,那么您需要递归。请参阅Joe的答案,了解一种方法。

回答标题中更一般的问题:

  1. 如果您只想以某种方式转换为二进制文件,请使用erlang:term_to_binary。适用于任何条款。

  2. 如果要获取包含术语字符串表示形式的二进制文件,请使用erlang:iolist_to_binary(io_lib:write(Term))

  3. 但是,这些方法都不会产生JSON。