2016-07-20 49 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?