【问题标题】:How to convert list of tuples to binary in erlang如何在erlang中将元组列表转换为二进制
【发布时间】:2015-10-05 19:13:06
【问题描述】:

假设我有

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 接受二进制输入。

【问题讨论】:

    标签: list binary erlang


    【解决方案1】:

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

    %% 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、在第一种情况下添加is_binary; 2. 只需要在最后一种情况下处理2元素元组,这样就简化了。
    • 很好,我将在is_binary 中进行编辑,省略这是一个疏忽。我还将为元组子句提供另一种形式。
    • 因为[{Key, Value}]格式匹配josn {Key : Value}所以只能是2-tuple-list
    【解决方案2】:

    JSX 有 encode 函数将 Erlang 术语编码为 JSON。但请注意,键应该是原子(from_email 不带引号或单引号)或二进制文件(&lt;&lt;"from_email"&gt;&gt;),而不是 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。

    【讨论】:

    • 作者不问如何将键从列表字符串转换为二进制字符串以便以后使用编码功能吗?
    • @Lol4t0 我不这么认为?他们说“将 Send_Mail 转换为二进制”,其中 Send_Mail 是一个元组列表。问题标题相同。
    • 不知何故这是我的印象。另一个答案实际上是在考虑相同的意见的情况下给出的。
    • @Lol4t0 但是,为了以防万一,我添加了答案。
    • @Lol4t0 你对另一个答案的观点是有道理的,我错过了。修正了我的评论。
    猜你喜欢
    • 2011-04-29
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2011-04-24
    • 2021-07-12
    • 2015-04-20
    • 2010-11-14
    相关资源
    最近更新 更多