the option single_quotes in functions dealing with json inputs now allows json that uses single quotes to deliminate keys and strings to be processed, note that this changes the escaping rules slightly
This commit is contained in:
parent
1d5b9e7410
commit
97a7d295f1
2 changed files with 29 additions and 29 deletions
|
@ -148,7 +148,7 @@ single_quotes_test_() ->
|
|||
},
|
||||
{"single quote in double quoted string",
|
||||
?_assertEqual(
|
||||
to_term(<<"[\"a single quote: '\"]">>),
|
||||
to_term(<<"[\"a single quote: '\"]">>, [single_quotes]),
|
||||
[<<"a single quote: '">>]
|
||||
)
|
||||
},
|
||||
|
@ -163,6 +163,12 @@ single_quotes_test_() ->
|
|||
badarg,
|
||||
to_term(<<"[\"a single quote: \\'\"]">>)
|
||||
)
|
||||
},
|
||||
{"mismatched quotes",
|
||||
?_assertError(
|
||||
badarg,
|
||||
to_term(<<"['mismatched\"]">>, [single_quotes])
|
||||
)
|
||||
}
|
||||
].
|
||||
|
||||
|
|
|
@ -134,7 +134,7 @@ decoder(Handler, State, Opts) ->
|
|||
value(<<?doublequote, Rest/binary>>, Handler, Stack, Opts) ->
|
||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||
value(<<?singlequote, Rest/binary>>, Handler, Stack, Opts = #opts{single_quotes=true}) ->
|
||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||
string(Rest, Handler, [?new_seq(), single_quote|Stack], Opts);
|
||||
value(<<$t, Rest/binary>>, Handler, Stack, Opts) ->
|
||||
tr(Rest, Handler, Stack, Opts);
|
||||
value(<<$f, Rest/binary>>, Handler, Stack, Opts) ->
|
||||
|
@ -162,7 +162,7 @@ value(Bin, Handler, Stack, Opts) ->
|
|||
object(<<?doublequote, Rest/binary>>, Handler, Stack, Opts) ->
|
||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||
object(<<?singlequote, Rest/binary>>, Handler, Stack, Opts = #opts{single_quotes=true}) ->
|
||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||
string(Rest, Handler, [?new_seq(), single_quote|Stack], Opts);
|
||||
object(<<?end_object, Rest/binary>>, {Handler, State}, [key|Stack], Opts) ->
|
||||
maybe_done(Rest, {Handler, Handler:handle_event(end_object, State)}, Stack, Opts);
|
||||
object(<<S, Rest/binary>>, Handler, Stack, Opts) when ?is_whitespace(S) ->
|
||||
|
@ -176,7 +176,7 @@ object(Bin, Handler, Stack, Opts) ->
|
|||
array(<<?doublequote, Rest/binary>>, Handler, Stack, Opts) ->
|
||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||
array(<<?singlequote, Rest/binary>>, Handler, Stack, Opts = #opts{single_quotes=true}) ->
|
||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||
string(Rest, Handler, [?new_seq(), single_quote|Stack], Opts);
|
||||
array(<<$t, Rest/binary>>, Handler, Stack, Opts) ->
|
||||
tr(Rest, Handler, Stack, Opts);
|
||||
array(<<$f, Rest/binary>>, Handler, Stack, Opts) ->
|
||||
|
@ -216,7 +216,7 @@ colon(Bin, Handler, Stack, Opts) ->
|
|||
key(<<?doublequote, Rest/binary>>, Handler, Stack, Opts) ->
|
||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||
key(<<?singlequote, Rest/binary>>, Handler, Stack, Opts = #opts{single_quotes=true}) ->
|
||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||
string(Rest, Handler, [?new_seq(), single_quote|Stack], Opts);
|
||||
key(<<S, Rest/binary>>, Handler, Stack, Opts) when ?is_whitespace(S) ->
|
||||
key(Rest, Handler, Stack, Opts);
|
||||
key(<<>>, Handler, Stack, Opts) ->
|
||||
|
@ -242,30 +242,24 @@ partial_utf(<<X, Y, Z>>)
|
|||
partial_utf(_) -> false.
|
||||
|
||||
|
||||
string(<<?doublequote, Rest/binary>>, {Handler, State}, [Acc, key|Stack], Opts) ->
|
||||
colon(Rest,
|
||||
{Handler, Handler:handle_event({key, ?end_seq(Acc)}, State)},
|
||||
[key|Stack],
|
||||
Opts
|
||||
);
|
||||
string(<<?singlequote, Rest/binary>>, {Handler, State}, [Acc, key|Stack], Opts = #opts{single_quotes=true}) ->
|
||||
colon(Rest,
|
||||
{Handler, Handler:handle_event({key, ?end_seq(Acc)}, State)},
|
||||
[key|Stack],
|
||||
Opts
|
||||
);
|
||||
string(<<?doublequote, Rest/binary>>, {Handler, State}, [Acc|Stack], Opts) ->
|
||||
maybe_done(Rest,
|
||||
{Handler, Handler:handle_event({string, ?end_seq(Acc)}, State)},
|
||||
Stack,
|
||||
Opts
|
||||
);
|
||||
string(<<?singlequote, Rest/binary>>, {Handler, State}, [Acc|Stack], Opts = #opts{single_quotes=true}) ->
|
||||
maybe_done(Rest,
|
||||
{Handler, Handler:handle_event({string, ?end_seq(Acc)}, State)},
|
||||
Stack,
|
||||
Opts
|
||||
);
|
||||
string(<<?doublequote, Rest/binary>>, {Handler, State}, S, Opts) ->
|
||||
case S of
|
||||
[Acc, key|Stack] ->
|
||||
colon(Rest, {Handler, Handler:handle_event({key, ?end_seq(Acc)}, State)}, [key|Stack], Opts);
|
||||
[_Acc, single_quote|_Stack] ->
|
||||
?error([<<?doublequote, Rest/binary>>, {Handler, State}, S, Opts]);
|
||||
[Acc|Stack] ->
|
||||
maybe_done(Rest, {Handler, Handler:handle_event({string, ?end_seq(Acc)}, State)}, Stack, Opts)
|
||||
end;
|
||||
string(<<?singlequote, Rest/binary>>, {Handler, State}, S, Opts = #opts{single_quotes=true}) ->
|
||||
case S of
|
||||
[Acc, single_quote, key|Stack] ->
|
||||
colon(Rest, {Handler, Handler:handle_event({key, ?end_seq(Acc)}, State)}, [key|Stack], Opts);
|
||||
[Acc, single_quote|Stack] ->
|
||||
maybe_done(Rest, {Handler, Handler:handle_event({string, ?end_seq(Acc)}, State)}, Stack, Opts);
|
||||
[Acc|Stack] ->
|
||||
string(Rest, {Handler, State}, [?acc_seq(Acc, ?singlequote)|Stack], Opts)
|
||||
end;
|
||||
string(<<?rsolidus/utf8, Rest/binary>>, Handler, Stack, Opts) ->
|
||||
escape(Rest, Handler, Stack, Opts);
|
||||
%% things get dumb here. erlang doesn't properly restrict unicode non-characters
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue