2016-07-20 8 views
0

:エラーを返してエンコード、:Erlangのリスト:私はJSXでJSON形式でタプルのリストを作成したいエンコードエラー

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

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

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

次のようにマイリストを印刷します

私はこのエラーを取得しています:

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}]}] 

誰かが正しいコードを指摘する場合、それは素晴らしいことです。 ありがとうございます。

答えて

2

erlang:tuple_to_list/1lists:map/2を使用してトップレベルのタプルをリストに変換して、jsxがそれらを正しくJSON配列にエンコードできるようにする必要があります。

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

ありがとうございました!魅力のように働いた。 – raich

0

私は私が判断する権利をした場合はそうではないことを確認、非常に多くのErlangの初心者だけど、私の気持ちは、JSXにリストするタプルを変換する必要性を隠すために良いだろうということです:エンコード。

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

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

になり

場合、私は同じことがこの最後の構文はより多くの情報をもたらします

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

この構文のためにも動作するはずと信じて(それは順序を反映しています私はコード内でパターンマッチングを期待することができます)。

私は通常、私が順序を知っているタプルにJSONを変換しようとします。そうすれば、keyfindやfriendsを使う代わりにパターンマッチングで遊ぶことができます。しかし、上記の構文は機能しないので、私はjsx:encode(tuple_to_list())を "PropTuples"を自動的に管理するためにラップする必要があります。

私はそれを完全に誤解していますか? ErlangでJSONを表現/処理/操作するためのより適切な方法がありますか?

関連する問題