Просмотр исходного кода

Replace 'jsx' with 'jiffy' to optimize json encode/decode

Feng Lee 6 лет назад
Родитель
Сommit
b3e2cc5a18
2 измененных файлов с 25 добавлено и 18 удалено
  1. 2 2
      rebar.config
  2. 23 16
      src/emqx_json.erl

+ 2 - 2
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"}}},

+ 23 - 16
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}