2015-10-05 46 views
2

假设我有如何元组列表转换为二进制二郎

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转换成二进制解析成杰森格式。我使用jsx进行解析,jsx使用二进制输入。

回答

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)}. 
+2

一些建议:1.将'is_binary'添加到第一个case; 2.你只需要处理最后一种情况下的2元元组,这简化了它。 –

+0

好,我会在'is_binary'中编辑,忽略这是一个疏忽。我还会为这个元组子句提供一个替代形式。 – Joe

+0

它只能是2元组列表,因为匹配josn的{[Key,Value}]格式'{Key:Value}' – Lol4t0

1

JSX具有encode功能二郎神方面编码为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))

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

+0

没有作者问如何将列表字符串中的键转换为二进制字符串以后使用编码功能? – Lol4t0

+0

@ Lol4t0我不这么认为?他们说“将Send_Mail转换为二进制”,其中“Send_Mail”是元组列表。问题标题相同。 –

+0

不知何故,这是我的印象。而另一个答案实际上是在脑海中给出相同的意见。 – Lol4t0