diff --git a/include/jsx_decoder.hrl b/include/jsx_decoder.hrl index 82f1872..4237ec6 100644 --- a/include/jsx_decoder.hrl +++ b/include/jsx_decoder.hrl @@ -141,15 +141,21 @@ parse_opts([], Opts) -> parse_opts([{comments, Value}|Rest], Opts) -> true = lists:member(Value, [true, false]), parse_opts(Rest, Opts#opts{comments=Value}); +parse_opts([comments|Rest], Opts) -> + parse_opts(Rest, Opts#opts{comments=true}); parse_opts([{escaped_unicode, Value}|Rest], Opts) -> true = lists:member(Value, [ascii, codepoint, none]), parse_opts(Rest, Opts#opts{escaped_unicode=Value}); parse_opts([{unquoted_keys, Value}|Rest], Opts) -> true = lists:member(Value, [true, false]), parse_opts(Rest, Opts#opts{unquoted_keys=Value}); +parse_opts([unquoted_keys|Rest], Opts) -> + parse_opts(Rest, Opts#opts{unquoted_keys=true}); parse_opts([{multi_term, Value}|Rest], Opts) -> true = lists:member(Value, [true, false]), parse_opts(Rest, Opts#opts{multi_term=Value}); +parse_opts([multi_term|Rest], Opts) -> + parse_opts(Rest, Opts#opts{multi_term=true}); parse_opts([{encoding, _}|Rest], Opts) -> parse_opts(Rest, Opts); parse_opts(_, _) -> diff --git a/src/jsx.erl b/src/jsx.erl index 1f60f36..8df7696 100644 --- a/src/jsx.erl +++ b/src/jsx.erl @@ -258,11 +258,14 @@ json_to_term(JSON) -> -spec json_to_term(JSON::binary(), Opts::decoder_opts()) -> eep0018(). +%json_to_term(JSON, Opts) -> +% try jsx_eep0018:json_to_term(JSON, Opts) +% %% rethrow exception so internals aren't confusingly exposed to users +% catch error:badarg -> erlang:error(badarg) +% end. + json_to_term(JSON, Opts) -> - try jsx_eep0018:json_to_term(JSON, Opts) - %% rethrow exception so internals aren't confusingly exposed to users - catch error:badarg -> erlang:error(badarg) - end. + jsx_eep0018:json_to_term(JSON, Opts). %% @spec term_to_json(JSON::eep0018()) -> binary() diff --git a/src/jsx_eep0018.erl b/src/jsx_eep0018.erl index 3072aca..1f27cf0 100644 --- a/src/jsx_eep0018.erl +++ b/src/jsx_eep0018.erl @@ -69,10 +69,19 @@ term_to_json(List, Opts) -> extract_parser_opts(Opts) -> - [ {K, V} || {K, V} <- - Opts, lists:member(K, [comments, encoding, unquoted_keys]) - ]. + extract_parser_opts(Opts, []). +extract_parser_opts([], Acc) -> Acc; +extract_parser_opts([{K,V}|Rest], Acc) -> + case lists:member(K, [comments, encoding, unquoted_keys]) of + true -> [{K,V}] ++ Acc + ; false -> extract_parser_opts(Rest, Acc) + end; +extract_parser_opts([K|Rest], Acc) -> + case lists:member(K, [comments, encoding, unquoted_keys]) of + true -> [K] ++ Acc + ; false -> extract_parser_opts(Rest, Acc) + end. %% ensure the first jsx event we get is start_object or start_array when running %% in strict mode diff --git a/src/jsx_format.erl b/src/jsx_format.erl index 481d355..4bd3cd3 100644 --- a/src/jsx_format.erl +++ b/src/jsx_format.erl @@ -72,9 +72,19 @@ parse_opts([], Opts) -> extract_parser_opts(Opts) -> - [ {K, V} || {K, V} <- - Opts, lists:member(K, [comments, encoding, unquoted_keys]) - ]. + extract_parser_opts(Opts, []). + +extract_parser_opts([], Acc) -> Acc; +extract_parser_opts([{K,V}|Rest], Acc) -> + case lists:member(K, [comments, encoding, unquoted_keys]) of + true -> [{K,V}] ++ Acc + ; false -> extract_parser_opts(Rest, Acc) + end; +extract_parser_opts([K|Rest], Acc) -> + case lists:member(K, [comments, encoding, unquoted_keys]) of + true -> [K] ++ Acc + ; false -> extract_parser_opts(Rest, Acc) + end. format_something({event, start_object, Next}, Opts, Level) -> diff --git a/src/jsx_verify.erl b/src/jsx_verify.erl index 1777922..890d7ac 100644 --- a/src/jsx_verify.erl +++ b/src/jsx_verify.erl @@ -51,9 +51,19 @@ is_json(JSON, Opts) -> extract_parser_opts(Opts) -> - [ {K, V} || {K, V} <- - Opts, lists:member(K, [comments, encoding, unquoted_keys]) - ]. + extract_parser_opts(Opts, []). + +extract_parser_opts([], Acc) -> Acc; +extract_parser_opts([{K,V}|Rest], Acc) -> + case lists:member(K, [comments, encoding, unquoted_keys]) of + true -> [{K,V}] ++ Acc + ; false -> extract_parser_opts(Rest, Acc) + end; +extract_parser_opts([K|Rest], Acc) -> + case lists:member(K, [comments, encoding, unquoted_keys]) of + true -> [K] ++ Acc + ; false -> extract_parser_opts(Rest, Acc) + end. %% enforce only arrays and objects at top level