2015-10-05 44 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