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/1
和 lists: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 有更好的方法吗?
我想用 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/1
和 lists: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 有更好的方法吗?