more fixes for json_escape

This commit is contained in:
alisdair sullivan 2012-03-30 23:17:05 -07:00
parent cd1a6deaaa
commit ad3e870615
2 changed files with 22 additions and 4 deletions

View file

@ -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_test_() ->
[ [
{"noncharacters - badjson", {"noncharacters - badjson",

View file

@ -105,15 +105,19 @@ fix_key(Key) when is_binary(Key) -> Key.
clean_string(Bin, Opts) -> clean_string(Bin, Opts) ->
case Opts#opts.loose_unicode of 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 -> ; false ->
case is_clean(Bin) of case is_clean(Bin) of
true -> jsx_utils:json_escape(Bin, Opts) true -> maybe_escape(Bin, Opts)
; false -> erlang:error(badarg, [Bin, Opts]) ; false -> erlang:error(badarg, [Bin, Opts])
end end
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(<<>>) -> true;
is_clean(<<X/utf8, Rest/binary>>) when X < 16#80 -> is_clean(Rest); is_clean(<<X/utf8, Rest/binary>>) when X < 16#80 -> is_clean(Rest);
is_clean(<<X/utf8, Rest/binary>>) when X < 16#800 -> is_clean(Rest); is_clean(<<X/utf8, Rest/binary>>) 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) -> encode(Term, Opts) ->
try (encoder(jsx, [], Opts))(Term) try (encoder(jsx, [], Opts))(Term)
@ -413,7 +417,8 @@ encode(Term, Opts) ->
encode_test_() -> 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 integer", ?_assertEqual(encode(123), [{integer, 123}, end_json])},
{"naked float", ?_assertEqual(encode(1.23), [{float, 1.23}, end_json])}, {"naked float", ?_assertEqual(encode(1.23), [{float, 1.23}, end_json])},
{"naked literal", ?_assertEqual(encode(null), [{literal, null}, end_json])}, {"naked literal", ?_assertEqual(encode(null), [{literal, null}, end_json])},