2016-07-20 12 views
0

ich eine Liste von Tupeln im JSON-Format mit jsx erstellen möchten: kodieren, die Fehler zurückgibt:Erlang Liste von Tupeln jsx: kodieren Fehler

io:format("Mylist After reverse ==========: ~n~p~n",[Mylist]), 

    FinalReading = lists:map(
       fun(X) -> 
        jsx:encode([X]) 
       end, Mylist), 

Mylist wird wie folgt gedruckt:

[{{<<"name">>,<<"Batman">>},{<<"steps">>,1033},{<<"distance">>,830}}, 
    {{<<"name">>,<<"Superman">>},{<<"steps">>,641},{<<"distance">>,520}}] 

ich erhalte diese Fehlermeldung:

09:49:24.048 [error] ** Boss Service Handler myproj_priv_mylib_websocket terminating in handle_incoming/4 
    for the reason error:badarg 
    ServiceUrl: "/websocket/mylib" 
    WebSocketId: <0.336.0> 
    SessionId : <<"a4f60118091309990af7c89c9a1acb49ee3bb08d">> 
    Message : <<"[email protected]:z3CMLU9jDTYdiAacNiJrMIkdp4lTf6sb">> 
    State : [] 
    ** Stacktrace: [{jsx_parser,value,4,[{file,"src/jsx_parser.erl"},{line,125}]},{lists,map,2,[{file,"lists.erl"},{line,1237}]},{myproj_priv_mylib_websocket,handle_incoming,5,[{file,"..."},{line,130}]},{boss_service_worker,handle_cast,2,[{file,"src/boss/boss_service_worker.erl"},{line,173}]},{gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,599}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}] 

Es wäre toll, wenn jemand den richtigen Code hinweist. Vielen Dank im Voraus.

Antwort

2

Sie müssen die Tupel auf oberster Ebene in Listen konvertieren, indem Sie erlang:tuple_to_list/1 und lists:map/2 verwenden, damit jsx sie korrekt in ein JSON-Array codieren kann.

1> List = [{{<<"name">>,<<"Batman">>},{<<"steps">>,1033},{<<"distance">>,830}}, 
1>   {{<<"name">>,<<"Superman">>},{<<"steps">>,641},{<<"distance">>,520}}]. 
[{{<<"name">>,<<"Batman">>}, 
    {<<"steps">>,1033}, 
    {<<"distance">>,830}}, 
{{<<"name">>,<<"Superman">>}, 
    {<<"steps">>,641}, 
    {<<"distance">>,520}}] 
2> List2 = lists:map(fun erlang:tuple_to_list/1, List). 
[[{<<"name">>,<<"Batman">>}, 
    {<<"steps">>,1033}, 
    {<<"distance">>,830}], 
[{<<"name">>,<<"Superman">>}, 
    {<<"steps">>,641}, 
    {<<"distance">>,520}]] 
3> io:format("~s~n", [jsx:encode(List2)]). 
[{"name":"Batman","steps":1033,"distance":830},{"name":"Superman","steps":641,"distance":520}] 
+0

Vielen Dank! Lief wie am Schnürchen. – raich

0

Ich bin sehr viel ein Neuling auf Erlang, also nicht sicher, ob ich das Recht zu beurteilen habe, aber mein Gefühl ist, dass es gut wäre, die Notwendigkeit, sich zu verstecken das Tupel konvertieren in jsx zur Liste :kodieren.

Wenn

[{a,<<"a">>}, {b,<<"b">>}]. 

wird
{ 
    "a" : "a", 
    "b" : "b" 
} 

ich das gleiche glauben sollte für diese Syntax auch funktionieren

{{a,<<"a">>}, {b,<<"b">>}}. 

Diese letzte Syntax Weitere Informationen bringt (es spiegelt eine Ordnung der Ich kann mich innerhalb des Codes auf die Mustererkennung verlassen.

Normalerweise versuche ich, mein JSON in ein Tupel zu konvertieren, für das ich die Reihenfolge kenne, damit ich mit Pattern Matching spielen kann, anstatt Keyfind und Freunde zu benutzen. Aber weil die obige Syntax nicht funktioniert, muss ich jsx:encode(tuple_to_list()) wickeln, um "PropTuples" automatisch zu verwalten.

Bin ich es völlig falsch? Gibt es einen besseren Weg, JSON in Erlang darzustellen/zu behandeln/zu manipulieren?