fix(json): fix decoding/encoding empty object error

This commit is contained in:
JianBo He 2020-10-24 11:26:56 +08:00 committed by tigercl
parent 8462da9652
commit b373c0cf1b
3 changed files with 40 additions and 14 deletions

View File

@ -1,3 +1,4 @@
%% -*-: erlang -*-
{DefaultLen, DefaultSize} = {DefaultLen, DefaultSize} =
case WordSize = erlang:system_info(wordsize) of case WordSize = erlang:system_info(wordsize) of
8 -> % arch_64 8 -> % arch_64
@ -9,10 +10,13 @@
[ [
{"4.2.1", [ {"4.2.1", [
{load_module, emqx_channel, brutal_purge, soft_purge, []}, {load_module, emqx_channel, brutal_purge, soft_purge, []},
{load_module, emqx_mod_topic_metrics, brutal_purge, soft_purge, []} {load_module, emqx_mod_topic_metrics, brutal_purge, soft_purge, []},
{load_module, emqx_json, brutal_purge, soft_purge, []}
]}, ]},
{"4.2.0", [ {"4.2.0", [
{load_module, emqx_channel, brutal_purge, soft_purge, []}, {load_module, emqx_channel, brutal_purge, soft_purge, []},
{load_module, emqx_mod_topic_metrics, brutal_purge, soft_purge, []},
{load_module, emqx_json, brutal_purge, soft_purge, []},
{apply, {application, set_env, {apply, {application, set_env,
[emqx, force_shutdown_policy, [emqx, force_shutdown_policy,
#{message_queue_len => DefaultLen, #{message_queue_len => DefaultLen,
@ -22,10 +26,13 @@
[ [
{"4.2.1", [ {"4.2.1", [
{load_module, emqx_channel, brutal_purge, soft_purge, []}, {load_module, emqx_channel, brutal_purge, soft_purge, []},
{load_module, emqx_mod_topic_metrics, brutal_purge, soft_purge, []} {load_module, emqx_mod_topic_metrics, brutal_purge, soft_purge, []},
{load_module, emqx_json, brutal_purge, soft_purge, []}
]}, ]},
{"4.2.0", [ {"4.2.0", [
{load_module, emqx_channel, brutal_purge, soft_purge, []} {load_module, emqx_channel, brutal_purge, soft_purge, []},
{load_module, emqx_mod_topic_metrics, brutal_purge, soft_purge, []},
{load_module, emqx_json, brutal_purge, soft_purge, []}
]} ]}
] ]
}. }.

View File

@ -103,6 +103,8 @@ safe_decode(Json, Opts) ->
, from_ejson/1 , from_ejson/1
]}). ]}).
to_ejson([{}]) ->
{[]};
to_ejson([{_, _}|_] = L) -> to_ejson([{_, _}|_] = L) ->
{[{K, to_ejson(V)} || {K, V} <- L ]}; {[{K, to_ejson(V)} || {K, V} <- L ]};
to_ejson(L) when is_list(L) -> to_ejson(L) when is_list(L) ->
@ -111,6 +113,8 @@ to_ejson(T) -> T.
from_ejson(L) when is_list(L) -> from_ejson(L) when is_list(L) ->
[from_ejson(E) || E <- L]; [from_ejson(E) || E <- L];
from_ejson({[]}) ->
[{}];
from_ejson({L}) -> from_ejson({L}) ->
[{Name, from_ejson(Value)} || {Name, Value} <- L]; [{Name, from_ejson(Value)} || {Name, Value} <- L];
from_ejson(T) -> T. from_ejson(T) -> T.
@ -118,4 +122,3 @@ from_ejson(T) -> T.
to_binary(B) when is_binary(B) -> B; to_binary(B) when is_binary(B) -> B;
to_binary(L) when is_list(L) -> to_binary(L) when is_list(L) ->
iolist_to_binary(L). iolist_to_binary(L).

View File

@ -27,6 +27,7 @@
, decode/2 , decode/2
]). ]).
%% copied jiffy/readme
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% Erlang JSON Erlang %% Erlang JSON Erlang
%% ------------------------------------------------------------------- %% -------------------------------------------------------------------
@ -45,10 +46,27 @@
%% {[{foo, bar}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]} %% {[{foo, bar}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]}
%% {[{<<"foo">>, <<"bar">>}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]} %% {[{<<"foo">>, <<"bar">>}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]}
%% #{<<"foo">> => <<"bar">>} -> {"foo": "bar"} -> #{<<"foo">> => <<"bar">>} %% #{<<"foo">> => <<"bar">>} -> {"foo": "bar"} -> #{<<"foo">> => <<"bar">>}
%%--------------------------------------------------------------------
%% but in emqx_json, we use the jsx style for it:
%%--------------------------------------------------------------------
%% Erlang JSON Erlang
%% -------------------------------------------------------------------
%% %%
%% Extension: %% null -> null -> null
%% [{<<"foo">>, <<"bar">>}] -> {"foo": "bar"} -> [{<<"foo">>, <<"bar">>}] %% true -> true -> true
%% %% false -> false -> false
%% "hi" -> [104, 105] -> [104, 105]
%% <<"hi">> -> "hi" -> <<"hi">>
%% hi -> "hi" -> <<"hi">>
%% 1 -> 1 -> 1
%% 1.25 -> 1.25 -> 1.25
%% [] -> [] -> []
%% [true, 1.0] -> [true, 1.0] -> [true, 1.0]
%m [{}] -> {} -> [{}]
%a [{<<"foo">>, <<"bar">>}] -> {"foo": "bar"} -> [{<<"foo">>, <<"bar">>}]
%% #{<<"foo">> => <<"bar">>} -> {"foo": "bar"} -> #{<<"foo">> => <<"bar">>}
%m #{<<"foo">> => [{}]} NOT SUPPORT
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
all() -> emqx_ct:all(?MODULE). all() -> emqx_ct:all(?MODULE).
@ -63,9 +81,8 @@ t_decode_encode(_) ->
1.25 = decode(encode(1.25)), 1.25 = decode(encode(1.25)),
[] = decode(encode([])), [] = decode(encode([])),
[true, 1] = decode(encode([true, 1])), [true, 1] = decode(encode([true, 1])),
[] = 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">>}])), [{<<"foo">>, <<"bar">>}] = decode(encode([{<<"foo">>, <<"bar">>}])),
[[{<<"foo">>, <<"bar">>}]] = decode(encode([[{<<"foo">>, <<"bar">>}]])), [[{<<"foo">>, <<"bar">>}]] = decode(encode([[{<<"foo">>, <<"bar">>}]])),
[[{<<"foo">>, <<"bar">>}, [[{<<"foo">>, <<"bar">>},
@ -92,10 +109,10 @@ t_safe_decode_encode(_) ->
1.25 = safe_encode_decode(1.25), 1.25 = safe_encode_decode(1.25),
[] = safe_encode_decode([]), [] = safe_encode_decode([]),
[true, 1] = safe_encode_decode([true, 1]), [true, 1] = safe_encode_decode([true, 1]),
[] = safe_encode_decode({[]}), [{}] = decode(encode([{}])),
[{<<"foo">>, <<"bar">>}] = safe_encode_decode({[{foo, bar}]}), [{<<"foo">>, <<"bar">>}] = safe_encode_decode([{foo, bar}]),
[{<<"foo">>, <<"bar">>}] = safe_encode_decode({[{<<"foo">>, <<"bar">>}]}),
[{<<"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, Json} = emqx_json:safe_encode(#{<<"foo">> => <<"bar">>}),
{ok, #{<<"foo">> := <<"bar">>}} = emqx_json:safe_decode(Json, [return_maps]). {ok, #{<<"foo">> := <<"bar">>}} = emqx_json:safe_decode(Json, [return_maps]).
@ -105,4 +122,3 @@ safe_encode_decode(Term) ->
{ok, {NTerm}} -> NTerm; {ok, {NTerm}} -> NTerm;
{ok, NTerm} -> NTerm {ok, NTerm} -> NTerm
end. end.