2017-01-30 82 views
4

我有一個使用jiffy庫生成的元組。解碼JSON屬性名來列出字符串,而不是二進制字符串在Erlang中使用Jiffy

例如:jiffy:decode(<<"{\"foo\":\"bar\"}">>).結果
{[{<<"foo">>,<<"bar">>}]}

我想<<"foo">>"foo"

是否有轉換<<"foo">>"foo"的方法嗎?

基本上我想轉換此:

[{<<"t">>,<<"getWebPagePreview">>},{<<"message">>,<<"google.com">>}]

成這樣:

[{"t",<<"getWebPagePreview">>},{"message",<<"google.com">>}]

注:認爲這是一個非常大的名單,我希望有一個有效的解決方案。

回答

5

有轉換二進制<<"hello">>到列表"hello"功能:

3> [{binary_to_list(X),Y} || {X,Y} <- L]. 
[{"t",<<"getWebPagePreview">>},{"message",<<"google.com">>}] 
4> 

您可以在嵌入此:

1> binary_to_list(<<"hello">>). 
"hello" 
2> L = [{<<"t">>,<<"getWebPagePreview">>},{<<"message">>,<<"google.com">>}]. 
[{<<"t">>,<<"getWebPagePreview">>}, 
{<<"message">>,<<"google.com">>}] 

可以使用列表解析將此到您的列表功能:

convert(List) -> 
    F = fun({X,Y}) -> {binary_to_list(X),Y} end, 
    [F(Tuple) || Tuple <- List]. 
+0

這是我們能做到的最好方法嗎?由於字符串非常大,我擔心效率。有沒有其他的方法,比如使用c語言和Erlang結合使用?或者其他方式? –

3

因爲(當)訂單的EL對此語句並不重要最有效的版本是

convert({List}) -> 
    {convert(List, [])}. 

convert([], Acc) -> Acc; 
convert([{X, Y}|T], Acc) -> 
    convert(T, [{binary_to_list(X), Y}|Acc]). 

當你想保留的元素strightforward版本以便與列表理解

convert({List}) -> 
    {[{binary_to_list(X), Y} || {X, Y} <- List]}. 

convert({List}) -> 
    {convert_(List)}. 

convert_([]) -> []; 
convert_([{X, Y}|T]) -> 
    [{binary_to_list(X), Y}|convert_(T)]. 
的(幾乎)完全等效
+0

這是做這件事的最好方法嗎?我很擔心解決方案的效率,因爲字符串非常大。 –

+2

對於這樣的示例,您可以對不同的解決方案進行基準測試:'timer:tc(module_name,convert_method,[List])''。但是,你不會找到更快的解決方案。 – Pascal