Декодировать имена свойств 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)].