2016-07-20 48 views
0

我想創建與JSX JSON格式元組的列表:編碼,其被返回錯誤:二郎列表:編碼錯誤

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

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

MYLIST打印爲如下:

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

我得到這個錯誤:

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

我非常新手到二郎,所以不知道如果我正確的判斷,但我的感覺是,這將是很好的隱藏了必要的元組JSX列出轉換:編碼。

如果

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

成爲

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

我相信同樣應該工作以及這個語法​​

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

最後這句法帶來了更多的信息(它反映的順序,其在代碼中,我可以指望模式匹配)。

我通常會嘗試將我的JSON轉換爲我知道排序的元組,以便我可以使用模式匹配而不是使用keyfind和friends。但是因爲上面的語法不起作用,我必須包裝jsx:encode(tuple_to_list())來自動管理「PropTuples」。

我完全誤解了嗎?是否有更體面的方式來表達/處理/操縱Erlang中的JSON?