Replace 'jsx' with 'jiffy' and add more test cases
This commit is contained in:
parent
b3e2cc5a18
commit
eea377eb8f
|
@ -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),
|
||||||
|
|
|
@ -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()}).
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue