2017-01-30 1 views
4

J'ai un tuple généré en utilisant la bibliothèque jiffy.Décoder les noms de propriété JSON pour répertorier les chaînes au lieu de chaînes binaires en utilisant Jiffy dans Erlang

Par exemple: jiffy:decode(<<"{\"foo\":\"bar\"}">>). résultats dans
{[{<<"foo">>,<<"bar">>}]}

Je veux <<"foo">> d'être "foo"

est-il un moyen pour convertir le <<"foo">> à "foo"?

Fondamentalement, je veux convertir ceci:

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

dans ce:

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

Note: considérer que ce soit une très grande liste, et je veux une solution efficace.

Répondre

5

il y a une fonction pour transformer un <<"hello">> binaire en une liste "hello":

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

Vous pouvez appliquer à votre liste à l'aide d'une compréhension de la liste:

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

vous pouvez intégrer cela dans un fonction:

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

Est-ce la meilleure façon de le faire? Étant donné que la chaîne est très grande, je suis préoccupé par l'efficacité. Existe-t-il un autre moyen, comme utiliser le langage c en combinaison avec Erlang? ou de toute autre manière? –

3

Parce que (quand) l'ordre d'el NTS n'a pas d'importance est

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

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

la version la plus efficace Lorsque vous voulez préserver l'ordre de la version de l'élément avec la compréhension de la liste

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

est le (presque) équivalent exact de

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

convert_([]) -> []; 
convert_([{X, Y}|T]) -> 
    [{binary_to_list(X), Y}|convert_(T)]. 
+0

Est-ce le meilleur moyen de le faire? Je suis préoccupé par l'efficacité de la solution, car la chaîne est très grande. –

+2

Pour un tel exemple, vous pouvez référencer les différentes solutions: 'timer: tc (nom_module, convert_method, [Liste])'. Mais oui, vous ne trouverez pas de solutions plus rapides. – Pascal