diff --git a/src/jsx_encoder.erl b/src/jsx_encoder.erl index c2e6995..50db861 100644 --- a/src/jsx_encoder.erl +++ b/src/jsx_encoder.erl @@ -47,8 +47,8 @@ start(Term, {Handler, State}, Opts) -> Handler:handle_event(end_json, value(Term, {Handler, State}, Opts)). -value(String, {Handler, State}, Opts) when is_binary(String) -> - Handler:handle_event({string, jsx_utils:json_escape(String, Opts)}, State); +value(String, {Handler, State}, _Opts) when is_binary(String) -> + Handler:handle_event({string, String}, State); value(Float, {Handler, State}, _Opts) when is_float(Float) -> Handler:handle_event({float, Float}, State); value(Int, {Handler, State}, _Opts) when is_integer(Int) -> @@ -73,7 +73,7 @@ list_or_object(List, {Handler, State}, Opts) -> object([{Key, Value}|Rest], {Handler, State}, Opts) -> object(Rest, {Handler, - value(Value, {Handler, Handler:handle_event({key, fix_key(Key, Opts)}, State)}, Opts) + value(Value, {Handler, Handler:handle_event({key, fix_key(Key)}, State)}, Opts) }, Opts); object([], {Handler, State}, _Opts) -> Handler:handle_event(end_object, State); object(Term, Handler, Opts) -> ?error([Term, Handler, Opts]). @@ -85,10 +85,8 @@ list([], {Handler, State}, _Opts) -> Handler:handle_event(end_array, State); list(Term, Handler, Opts) -> ?error([Term, Handler, Opts]). -fix_key(Key, Opts) when is_binary(Key) -> - jsx_utils:json_escape(Key, Opts); -fix_key(Key, Opts) when is_atom(Key) -> - jsx_utils:json_escape(atom_to_binary(Key, utf8), Opts). +fix_key(Key) when is_binary(Key) -> Key; +fix_key(Key) when is_atom(Key) -> atom_to_binary(Key, utf8). -ifdef(TEST). diff --git a/src/jsx_to_json.erl b/src/jsx_to_json.erl index 30c6ffd..07cf7e8 100644 --- a/src/jsx_to_json.erl +++ b/src/jsx_to_json.erl @@ -78,7 +78,7 @@ init(Opts) -> {start, [], parse_opts(Opts)}. handle_event(Event, {start, Acc, Opts}) -> case Event of - {Type, Value} -> {[], [Acc, encode(Type, Value)], Opts} + {Type, Value} -> {[], [Acc, encode(Type, Value, Opts)], Opts} ; start_object -> {[object_start], [Acc, ?start_object], Opts} ; start_array -> {[array_start], [Acc, ?start_array], Opts} end; @@ -86,7 +86,7 @@ handle_event(Event, {[object_start|Stack], Acc, OldOpts = #opts{depth = Depth}}) Opts = OldOpts#opts{depth = Depth + 1}, case Event of {key, Key} -> - {[object_value|Stack], [Acc, indent(Opts), encode(string, Key), ?colon, space(Opts)], Opts} + {[object_value|Stack], [Acc, indent(Opts), encode(string, Key, Opts), ?colon, space(Opts)], Opts} ; end_object -> {Stack, [Acc, ?end_object], OldOpts} end; @@ -94,14 +94,14 @@ handle_event(Event, {[object_value|Stack], Acc, Opts}) -> case Event of {Type, Value} when Type == string; Type == literal; Type == integer; Type == float -> - {[key|Stack], [Acc, encode(Type, Value)], Opts} + {[key|Stack], [Acc, encode(Type, Value, Opts)], Opts} ; start_object -> {[object_start, key|Stack], [Acc, ?start_object], Opts} ; start_array -> {[array_start, key|Stack], [Acc, ?start_array], Opts} end; handle_event(Event, {[key|Stack], Acc, Opts = #opts{depth = Depth}}) -> case Event of {key, Key} -> - {[object_value|Stack], [Acc, ?comma, indent_or_space(Opts), encode(string, Key), ?colon, space(Opts)], Opts} + {[object_value|Stack], [Acc, ?comma, indent_or_space(Opts), encode(string, Key, Opts), ?colon, space(Opts)], Opts} ; end_object -> NewOpts = Opts#opts{depth = Depth - 1}, {Stack, [Acc, indent(NewOpts), ?end_object], NewOpts} @@ -111,7 +111,7 @@ handle_event(Event, {[array_start|Stack], Acc, OldOpts = #opts{depth = Depth}}) case Event of {Type, Value} when Type == string; Type == literal; Type == integer; Type == float -> - {[array|Stack], [Acc, indent(Opts), encode(Type, Value)], Opts} + {[array|Stack], [Acc, indent(Opts), encode(Type, Value, Opts)], Opts} ; start_object -> {[object_start, array|Stack], [Acc, indent(Opts), ?start_object], Opts} ; start_array -> {[array_start, array|Stack], [Acc, indent(Opts), ?start_array], Opts} ; end_array -> {Stack, [Acc, ?end_array], OldOpts} @@ -120,7 +120,7 @@ handle_event(Event, {[array|Stack], Acc, Opts = #opts{depth = Depth}}) -> case Event of {Type, Value} when Type == string; Type == literal; Type == integer; Type == float -> - {[array|Stack], [Acc, ?comma, indent_or_space(Opts), encode(Type, Value)], Opts} + {[array|Stack], [Acc, ?comma, indent_or_space(Opts), encode(Type, Value, Opts)], Opts} ; end_array -> NewOpts = Opts#opts{depth = Depth - 1}, {Stack, [Acc, indent(NewOpts), ?end_array], NewOpts} @@ -130,13 +130,13 @@ handle_event(Event, {[array|Stack], Acc, Opts = #opts{depth = Depth}}) -> handle_event(end_json, {[], Acc, _Opts}) -> unicode:characters_to_binary(Acc, utf8). -encode(string, String) -> - [?quote, String, ?quote]; -encode(literal, Literal) -> +encode(string, String, Opts) -> + [?quote, jsx_utils:json_escape(String, Opts), ?quote]; +encode(literal, Literal, _Opts) -> erlang:atom_to_list(Literal); -encode(integer, Integer) -> +encode(integer, Integer, _Opts) -> erlang:integer_to_list(Integer); -encode(float, Float) -> +encode(float, Float, _Opts) -> jsx_utils:nice_decimal(Float).