假设我有
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使用二进制输入。
答案 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的答案,了解一种方法。
回答标题中更一般的问题:
如果您只想以某种方式转换为二进制文件,请使用erlang:term_to_binary
。适用于任何条款。
如果要获取包含术语字符串表示形式的二进制文件,请使用erlang:iolist_to_binary(io_lib:write(Term))
。
但是,这些方法都不会产生JSON。