From b3e2cc5a18155128e90865534cad8e90d3b0c2e2 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Sun, 19 Jan 2020 11:35:56 +0800 Subject: [PATCH] Replace 'jsx' with 'jiffy' to optimize json encode/decode --- rebar.config | 4 ++-- src/emqx_json.erl | 39 +++++++++++++++++++++++---------------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/rebar.config b/rebar.config index 98ce306f0..d2cb0cf24 100644 --- a/rebar.config +++ b/rebar.config @@ -1,8 +1,8 @@ {minimum_otp_vsn, "21.0"}. {deps, - [{jsx, "2.10.0"}, - {gproc, "0.8.0"}, + [{gproc, "0.8.0"}, + {jiffy, "1.0.1"}, {cowboy, {git, "https://github.com/emqx/cowboy", {tag, "2.7.1"}}}, {esockd, {git, "https://github.com/emqx/esockd", {tag, "5.6.0"}}}, {ekka, {git, "https://github.com/emqx/ekka", {tag, "0.7.1"}}}, diff --git a/src/emqx_json.erl b/src/emqx_json.erl index 1424ede51..b54340963 100644 --- a/src/emqx_json.erl +++ b/src/emqx_json.erl @@ -40,22 +40,30 @@ , decode/2 ]}). --spec(encode(jsx:json_term()) -> jsx:json_text()). +-type(encode_options() :: jiffy:encode_options()). +-type(decode_options() :: jiffy:decode_options()). + +-type(json_text() :: iolist() | binary()). +-type(json_term() :: jiffy:jiffy_decode_result()). + +-export_type([json_text/0, json_term/0]). +-export_type([decode_options/0, encode_options/0]). + +-spec(encode(json_term()) -> json_text()). encode(Term) -> jsx:encode(Term). --spec(encode(jsx:json_term(), jsx_to_json:config()) - -> jsx:json_text()). +-spec(encode(json_term(), encode_options()) -> json_text()). encode(Term, Opts) -> jsx:encode(Term, Opts). --spec(safe_encode(jsx:json_term()) - -> {ok, jsx:json_text()} | {error, Reason :: term()}). +-spec(safe_encode(json_term()) + -> {ok, json_text()} | {error, Reason :: term()}). safe_encode(Term) -> safe_encode(Term, []). --spec(safe_encode(jsx:json_term(), jsx_to_json:config()) - -> {ok, jsx:json_text()} | {error, Reason :: term()}). +-spec(safe_encode(json_term(), encode_options()) + -> {ok, json_text()} | {error, Reason :: term()}). safe_encode(Term, Opts) -> try encode(Term, Opts) of Json -> {ok, Json} @@ -64,22 +72,21 @@ safe_encode(Term, Opts) -> {error, Reason} end. --spec(decode(jsx:json_text()) -> jsx:json_term()). +-spec(decode(json_text()) -> json_term()). decode(Json) -> - jsx:decode(Json). + case jsx:decode(Json) of {Term} -> Term; Other -> Other end. --spec(decode(jsx:json_text(), jsx_to_json:config()) - -> jsx:json_term()). +-spec(decode(json_text(), decode_options()) -> json_term()). decode(Json, Opts) -> - jsx:decode(Json, Opts). + case jsx:decode(Json, Opts) of {Term} -> Term; Other -> Other end. --spec(safe_decode(jsx:json_text()) - -> {ok, jsx:json_term()} | {error, Reason :: term()}). +-spec(safe_decode(json_text()) + -> {ok, json_term()} | {error, Reason :: term()}). safe_decode(Json) -> safe_decode(Json, []). --spec(safe_decode(jsx:json_text(), jsx_to_json:config()) - -> {ok, jsx:json_term()} | {error, Reason :: term()}). +-spec(safe_decode(json_text(), decode_options()) + -> {ok, json_term()} | {error, Reason :: term()}). safe_decode(Json, Opts) -> try decode(Json, Opts) of Term -> {ok, Term}