From ad3e870615f8c6fd9ba228388c8833ff83f507fe Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Fri, 30 Mar 2012 23:17:05 -0700 Subject: [PATCH] more fixes for json_escape --- src/jsx_decoder.erl | 13 +++++++++++++ src/jsx_encoder.erl | 13 +++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index a6c1451..b6311c8 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -1452,6 +1452,19 @@ escape_forward_slash_test_() -> ]. +json_escape_test_() -> + [ + {"json escape test", ?_assertEqual( + decode(<<"[\"a string\\n\"]">>, [json_escape]), + [start_array, {string, <<"a string\\n">>}, end_array, end_json] + )}, + {"no json escape test", ?_assertEqual( + decode(<<"[\"a string\\n\"]">>, []), + [start_array, {string, <<"a string\n">>}, end_array, end_json] + )} + ]. + + noncharacters_test_() -> [ {"noncharacters - badjson", diff --git a/src/jsx_encoder.erl b/src/jsx_encoder.erl index f1d14f6..cc43a1a 100644 --- a/src/jsx_encoder.erl +++ b/src/jsx_encoder.erl @@ -105,15 +105,19 @@ fix_key(Key) when is_binary(Key) -> Key. clean_string(Bin, Opts) -> case Opts#opts.loose_unicode of - true -> jsx_utils:json_escape(clean_string(Bin, 0, size(Bin), Opts), Opts) + true -> maybe_escape(clean_string(Bin, 0, size(Bin), Opts), Opts) ; false -> case is_clean(Bin) of - true -> jsx_utils:json_escape(Bin, Opts) + true -> maybe_escape(Bin, Opts) ; false -> erlang:error(badarg, [Bin, Opts]) end end. +maybe_escape(Bin, Opts=#opts{json_escape=true}) -> jsx_utils:json_escape(Bin, Opts); +maybe_escape(Bin, _) -> Bin. + + is_clean(<<>>) -> true; is_clean(<>) when X < 16#80 -> is_clean(Rest); is_clean(<>) when X < 16#800 -> is_clean(Rest); @@ -403,7 +407,7 @@ bad_utf8_test_() -> ]. -encode(Term) -> (encoder(jsx, [], []))(Term). +encode(Term) -> encode(Term, []). encode(Term, Opts) -> try (encoder(jsx, [], Opts))(Term) @@ -413,7 +417,8 @@ encode(Term, Opts) -> encode_test_() -> [ - {"naked string", ?_assertEqual(encode(<<"a string">>), [{string, <<"a string">>}, end_json])}, + {"naked string", ?_assertEqual(encode(<<"a string\n">>), [{string, <<"a string\n">>}, end_json])}, + {"escaped naked string", ?_assertEqual(encode(<<"a string\n">>, [json_escape]), [{string, <<"a string\\n">>}, end_json])}, {"naked integer", ?_assertEqual(encode(123), [{integer, 123}, end_json])}, {"naked float", ?_assertEqual(encode(1.23), [{float, 1.23}, end_json])}, {"naked literal", ?_assertEqual(encode(null), [{literal, null}, end_json])},