diff --git a/rebar.config b/rebar.config index 71bd53abc..2827059f7 100644 --- a/rebar.config +++ b/rebar.config @@ -2,7 +2,7 @@ {deps, [{gproc, "0.8.0"}, - {jiffy, "1.0.1"}, + {jiffy, {git, "https://github.com/emqx/jiffy", {tag, "1.0.2"}}}, {cowboy, {git, "https://github.com/emqx/cowboy", {tag, "2.7.1"}}}, {esockd, {git, "https://github.com/emqx/esockd", {tag, "5.6.1"}}}, {ekka, {git, "https://github.com/emqx/ekka", {tag, "0.7.2"}}}, diff --git a/src/emqx_json.erl b/src/emqx_json.erl index 27792c36c..563909e2c 100644 --- a/src/emqx_json.erl +++ b/src/emqx_json.erl @@ -51,11 +51,11 @@ -spec(encode(json_term()) -> json_text()). encode(Term) -> - jiffy:encode(Term). + encode(Term, []). -spec(encode(json_term(), encode_options()) -> json_text()). encode(Term, Opts) -> - jiffy:encode(Term, Opts). + jiffy:encode(to_ejson(Term), Opts). -spec(safe_encode(json_term()) -> {ok, json_text()} | {error, Reason :: term()}). @@ -77,7 +77,7 @@ decode(Json) -> decode(Json, []). -spec(decode(json_text(), decode_options()) -> json_term()). decode(Json, Opts) -> - case jiffy:decode(Json, Opts) of {Term} -> Term; Other -> Other end. + from_ejson(jiffy:decode(Json, Opts)). -spec(safe_decode(json_text()) -> {ok, json_term()} | {error, Reason :: term()}). @@ -94,3 +94,23 @@ safe_decode(Json, Opts) -> {error, Reason} end. +%%-------------------------------------------------------------------- +%% Helpers +%%-------------------------------------------------------------------- + +-compile({inline, + [ to_ejson/1 + , from_ejson/1 + ]}). + +to_ejson([{_, _}|_] = L) -> + lists:foldl( + fun({Name, Value}, Acc) -> + Acc#{Name => to_ejson(Value)} + end, #{}, L); +to_ejson(T) -> T. + +from_ejson({L}) -> + [{Name, from_ejson(Value)} || {Name, Value} <- L]; +from_ejson(T) -> T. + diff --git a/test/emqx_connection_SUITE.erl b/test/emqx_connection_SUITE.erl index e0da75fed..8e1362b32 100644 --- a/test/emqx_connection_SUITE.erl +++ b/test/emqx_connection_SUITE.erl @@ -93,7 +93,7 @@ t_info(_) -> {'$gen_call', From, info} -> gen_server:reply(From, emqx_connection:info(st())) after - 200 -> error("error") + 100 -> error("error") end end), #{sockinfo := SockInfo} = emqx_connection:info(CPid), @@ -113,15 +113,15 @@ t_stats(_) -> {'$gen_call', From, stats} -> gen_server:reply(From, emqx_connection:stats(st())) after - 0 -> error("error") + 100 -> error("error") end end), Stats = emqx_connection:stats(CPid), ?assertMatch([{recv_oct,0}, - {recv_cnt,0}, - {send_oct,0}, - {send_cnt,0}, - {send_pend,0}| _] , Stats). + {recv_cnt,0}, + {send_oct,0}, + {send_cnt,0}, + {send_pend,0}| _] , Stats). t_process_msg(_) -> with_conn(fun(CPid) -> @@ -384,7 +384,7 @@ trap_exit(Pid, Reason) -> {'EXIT', Pid, Reason} -> ok; {'EXIT', Pid, Other} -> error({unexpect_exit, Other}) after - 0 -> error({expect_exit, Reason}) + 100 -> error({expect_exit, Reason}) end. make_frame(Packet) -> diff --git a/test/emqx_json_SUITE.erl b/test/emqx_json_SUITE.erl index b08ca37c9..d0adf0650 100644 --- a/test/emqx_json_SUITE.erl +++ b/test/emqx_json_SUITE.erl @@ -45,6 +45,10 @@ %% {[{foo, bar}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]} %% {[{<<"foo">>, <<"bar">>}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]} %% #{<<"foo">> => <<"bar">>} -> {"foo": "bar"} -> #{<<"foo">> => <<"bar">>} +%% +%% Extension: +%% [{<<"foo">>, <<"bar">>}] -> {"foo": "bar"} -> [{<<"foo">>, <<"bar">>}] +%% %%-------------------------------------------------------------------- all() -> emqx_ct:all(?MODULE). @@ -62,6 +66,7 @@ t_decode_encode(_) -> [] = decode(encode({[]})), [{<<"foo">>, <<"bar">>}] = decode(encode({[{foo, bar}]})), [{<<"foo">>, <<"bar">>}] = decode(encode({[{<<"foo">>, <<"bar">>}]})), + [{<<"foo">>, <<"bar">>}] = decode(encode([{<<"foo">>, <<"bar">>}])), #{<<"foo">> := <<"bar">>} = decode(encode(#{<<"foo">> => <<"bar">>}), [return_maps]), JsonText = <<"{\"bool\":true,\"int\":10,\"foo\":\"bar\"}">>, JsonMaps = #{<<"bool">> => true, @@ -84,6 +89,7 @@ t_safe_decode_encode(_) -> [] = safe_encode_decode({[]}), [{<<"foo">>, <<"bar">>}] = safe_encode_decode({[{foo, bar}]}), [{<<"foo">>, <<"bar">>}] = safe_encode_decode({[{<<"foo">>, <<"bar">>}]}), + [{<<"foo">>, <<"bar">>}] = safe_encode_decode([{<<"foo">>, <<"bar">>}]), {ok, Json} = emqx_json:safe_encode(#{<<"foo">> => <<"bar">>}), {ok, #{<<"foo">> := <<"bar">>}} = emqx_json:safe_decode(Json, [return_maps]).