Декодировать имена свойств JSON для вывода списка строк вместо двоичных строк, используя Jiffy в Erlang

У меня есть кортеж, созданный с использованием библиотеки Jiffy.

Например: jiffy:decode(<<"{\"foo\":\"bar\"}">>). результаты в
{[{<<"foo">>,<<"bar">>}]}

я хочу <<"foo">> быть "foo"

Есть ли способ для преобразования <<"foo">> в "foo"?

В основном я хочу преобразовать это:

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

в это:

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

примечание: считаю, что это очень большой список, и я хочу эффективное решение.

2 ответа

Есть функция для преобразования двоичного <<"hello">> в список "hello":

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

Вы можете применить это к своему списку, используя понимание списка:

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

Вы можете встроить это в функцию:

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

Потому что (когда) порядок элементов не имеет значения, самая эффективная версия

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

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

Когда вы хотите сохранить порядок элемента прямо-версия с пониманием списка

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)].
Другие вопросы по тегам