Replace 'jsx' with 'jiffy' and add more test cases

This commit is contained in:
Feng Lee 2020-01-19 14:32:59 +08:00
parent b3e2cc5a18
commit eea377eb8f
3 changed files with 83 additions and 27 deletions

View File

@ -154,16 +154,21 @@ encode_alarm({AlarmId, #alarm{severity = Severity,
title = Title, title = Title,
summary = Summary, summary = Summary,
timestamp = Ts}}) -> timestamp = Ts}}) ->
emqx_json:safe_encode([{id, maybe_to_binary(AlarmId)}, Descr = #{severity => Severity,
{desc, [{severity, Severity}, title => iolist_to_binary(Title),
{title, iolist_to_binary(Title)}, summary => iolist_to_binary(Summary),
{summary, iolist_to_binary(Summary)}, timestamp => Ts
{timestamp, Ts}]}]); },
emqx_json:safe_encode(#{id => maybe_to_binary(AlarmId),
desc => Descr
});
encode_alarm({AlarmId, undefined}) -> encode_alarm({AlarmId, undefined}) ->
emqx_json:safe_encode([{id, maybe_to_binary(AlarmId)}]); emqx_json:safe_encode(#{id => maybe_to_binary(AlarmId)});
encode_alarm({AlarmId, AlarmDesc}) -> encode_alarm({AlarmId, AlarmDesc}) ->
emqx_json:safe_encode([{id, maybe_to_binary(AlarmId)}, emqx_json:safe_encode(#{id => maybe_to_binary(AlarmId),
{desc, maybe_to_binary(AlarmDesc)}]). desc => maybe_to_binary(AlarmDesc)
}).
alarm_msg(Topic, Payload) -> alarm_msg(Topic, Payload) ->
Msg = emqx_message:make(?MODULE, Topic, Payload), Msg = emqx_message:make(?MODULE, Topic, Payload),

View File

@ -51,11 +51,11 @@
-spec(encode(json_term()) -> json_text()). -spec(encode(json_term()) -> json_text()).
encode(Term) -> encode(Term) ->
jsx:encode(Term). jiffy:encode(Term).
-spec(encode(json_term(), encode_options()) -> json_text()). -spec(encode(json_term(), encode_options()) -> json_text()).
encode(Term, Opts) -> encode(Term, Opts) ->
jsx:encode(Term, Opts). jiffy:encode(Term, Opts).
-spec(safe_encode(json_term()) -spec(safe_encode(json_term())
-> {ok, json_text()} | {error, Reason :: term()}). -> {ok, json_text()} | {error, Reason :: term()}).
@ -73,12 +73,11 @@ safe_encode(Term, Opts) ->
end. end.
-spec(decode(json_text()) -> json_term()). -spec(decode(json_text()) -> json_term()).
decode(Json) -> decode(Json) -> decode(Json, []).
case jsx:decode(Json) of {Term} -> Term; Other -> Other end.
-spec(decode(json_text(), decode_options()) -> json_term()). -spec(decode(json_text(), decode_options()) -> json_term()).
decode(Json, Opts) -> decode(Json, Opts) ->
case jsx:decode(Json, Opts) of {Term} -> Term; Other -> Other end. case jiffy:decode(Json, Opts) of {Term} -> Term; Other -> Other end.
-spec(safe_decode(json_text()) -spec(safe_decode(json_text())
-> {ok, json_term()} | {error, Reason :: term()}). -> {ok, json_term()} | {error, Reason :: term()}).

View File

@ -21,24 +21,76 @@
-include_lib("eunit/include/eunit.hrl"). -include_lib("eunit/include/eunit.hrl").
-define(DEC_OPTS, [{labels, atom}, return_maps]). -import(emqx_json,
[ encode/1
, decode/1
, decode/2
]).
%%--------------------------------------------------------------------
%% Erlang JSON Erlang
%% -------------------------------------------------------------------
%%
%% null -> null -> null
%% 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]
%% {[]} -> {} -> {[]}
%% {[{foo, bar}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]}
%% {[{<<"foo">>, <<"bar">>}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]}
%% #{<<"foo">> => <<"bar">>} -> {"foo": "bar"} -> #{<<"foo">> => <<"bar">>}
%%--------------------------------------------------------------------
all() -> emqx_ct:all(?MODULE). all() -> emqx_ct:all(?MODULE).
t_decode_encode(_) -> t_decode_encode(_) ->
JsonText = <<"{\"library\": \"jsx\", \"awesome\": true}">>, null = decode(encode(null)),
JsonTerm = emqx_json:decode(JsonText), true = decode(encode(true)),
JsonMaps = #{library => <<"jsx">>, awesome => true}, false = decode(encode(false)),
?assertEqual(JsonText, emqx_json:encode(JsonTerm, [{space, 1}])), "hi" = decode(encode("hi")),
?assertEqual(JsonMaps, emqx_json:decode(JsonText, ?DEC_OPTS)). <<"hi">> = decode(encode(hi)),
1 = decode(encode(1)),
1.25 = decode(encode(1.25)),
[] = decode(encode([])),
[true, 1] = decode(encode([true, 1])),
[] = decode(encode({[]})),
[{<<"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,
<<"int">> => 10,
<<"foo">> => <<"bar">>
},
?assertEqual(JsonText, encode({decode(JsonText)})),
?assertEqual(JsonMaps, decode(JsonText, [return_maps])).
t_safe_decode_encode(_) -> t_safe_decode_encode(_) ->
JsonText = <<"{\"library\": \"jsx\", \"awesome\": true}">>, safe_encode_decode(null),
{ok, JsonTerm} = emqx_json:safe_decode(JsonText), safe_encode_decode(true),
JsonMaps = #{library => <<"jsx">>, awesome => true}, safe_encode_decode(false),
?assertEqual({ok, JsonText}, emqx_json:safe_encode(JsonTerm, [{space, 1}])), "hi" = safe_encode_decode("hi"),
?assertEqual({ok, JsonMaps}, emqx_json:safe_decode(JsonText, ?DEC_OPTS)), <<"hi">> = safe_encode_decode(hi),
BadJsonText = <<"{\"library\", \"awesome\": true}">>, 1 = safe_encode_decode(1),
?assertEqual({error, badarg}, emqx_json:safe_decode(BadJsonText)), 1.25 = safe_encode_decode(1.25),
{error, badarg} = emqx_json:safe_encode({a, {b ,1}}). [] = safe_encode_decode([]),
[true, 1] = safe_encode_decode([true, 1]),
[] = safe_encode_decode({[]}),
[{<<"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]).
safe_encode_decode(Term) ->
{ok, Json} = emqx_json:safe_encode(Term),
case emqx_json:safe_decode(Json) of
{ok, {NTerm}} -> NTerm;
{ok, NTerm} -> NTerm
end.