Erlang 元组列表 jsx:encode 错误

Erlang list of tuples jsx:encode error

我想用 jsx:encode 创建 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    : <<"admin@mydomain.com: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}]}]

如果有人指出正确的代码就太好了。 在此先感谢大家。

您必须使用 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}]

我是 Erlang 的新手,所以不确定我是否有判断力,但我的感觉是隐藏将元组转换为列表的需要隐藏在 jsx:encode.

如果

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

变成

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

我相信同样适用于此语法

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

最后一个语法提供了更多信息(它反映了我可以在代码中进行模式匹配的顺序)。

我通常尝试将我的 JSON 转换成一个我知道顺序的元组,这样我就可以玩模式匹配而不是使用 keyfind 和朋友。但是因为上面的语法不行,我只好把jsx:encode(tuple_to_list())换行自动管理"PropTuples".

我完全误解了吗?在 Erlang 中 represent/treat/manipulate JSON 有更好的方法吗?