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",
|
{"single quote in double quoted string",
|
||||||
?_assertEqual(
|
?_assertEqual(
|
||||||
to_term(<<"[\"a single quote: '\"]">>),
|
to_term(<<"[\"a single quote: '\"]">>, [single_quotes]),
|
||||||
[<<"a single quote: '">>]
|
[<<"a single quote: '">>]
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
@ -163,6 +163,12 @@ single_quotes_test_() ->
|
||||||
badarg,
|
badarg,
|
||||||
to_term(<<"[\"a single quote: \\'\"]">>)
|
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) ->
|
value(<<?doublequote, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||||
value(<<?singlequote, Rest/binary>>, Handler, Stack, Opts = #opts{single_quotes=true}) ->
|
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) ->
|
value(<<$t, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
tr(Rest, Handler, Stack, Opts);
|
tr(Rest, Handler, Stack, Opts);
|
||||||
value(<<$f, Rest/binary>>, 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) ->
|
object(<<?doublequote, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||||
object(<<?singlequote, Rest/binary>>, Handler, Stack, Opts = #opts{single_quotes=true}) ->
|
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) ->
|
object(<<?end_object, Rest/binary>>, {Handler, State}, [key|Stack], Opts) ->
|
||||||
maybe_done(Rest, {Handler, Handler:handle_event(end_object, State)}, 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) ->
|
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) ->
|
array(<<?doublequote, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||||
array(<<?singlequote, Rest/binary>>, Handler, Stack, Opts = #opts{single_quotes=true}) ->
|
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) ->
|
array(<<$t, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
tr(Rest, Handler, Stack, Opts);
|
tr(Rest, Handler, Stack, Opts);
|
||||||
array(<<$f, Rest/binary>>, 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) ->
|
key(<<?doublequote, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||||
key(<<?singlequote, Rest/binary>>, Handler, Stack, Opts = #opts{single_quotes=true}) ->
|
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(<<S, Rest/binary>>, Handler, Stack, Opts) when ?is_whitespace(S) ->
|
||||||
key(Rest, Handler, Stack, Opts);
|
key(Rest, Handler, Stack, Opts);
|
||||||
key(<<>>, Handler, Stack, Opts) ->
|
key(<<>>, Handler, Stack, Opts) ->
|
||||||
|
@ -242,30 +242,24 @@ partial_utf(<<X, Y, Z>>)
|
||||||
partial_utf(_) -> false.
|
partial_utf(_) -> false.
|
||||||
|
|
||||||
|
|
||||||
string(<<?doublequote, Rest/binary>>, {Handler, State}, [Acc, key|Stack], Opts) ->
|
string(<<?doublequote, Rest/binary>>, {Handler, State}, S, Opts) ->
|
||||||
colon(Rest,
|
case S of
|
||||||
{Handler, Handler:handle_event({key, ?end_seq(Acc)}, State)},
|
[Acc, key|Stack] ->
|
||||||
[key|Stack],
|
colon(Rest, {Handler, Handler:handle_event({key, ?end_seq(Acc)}, State)}, [key|Stack], Opts);
|
||||||
Opts
|
[_Acc, single_quote|_Stack] ->
|
||||||
);
|
?error([<<?doublequote, Rest/binary>>, {Handler, State}, S, Opts]);
|
||||||
string(<<?singlequote, Rest/binary>>, {Handler, State}, [Acc, key|Stack], Opts = #opts{single_quotes=true}) ->
|
[Acc|Stack] ->
|
||||||
colon(Rest,
|
maybe_done(Rest, {Handler, Handler:handle_event({string, ?end_seq(Acc)}, State)}, Stack, Opts)
|
||||||
{Handler, Handler:handle_event({key, ?end_seq(Acc)}, State)},
|
end;
|
||||||
[key|Stack],
|
string(<<?singlequote, Rest/binary>>, {Handler, State}, S, Opts = #opts{single_quotes=true}) ->
|
||||||
Opts
|
case S of
|
||||||
);
|
[Acc, single_quote, key|Stack] ->
|
||||||
string(<<?doublequote, Rest/binary>>, {Handler, State}, [Acc|Stack], Opts) ->
|
colon(Rest, {Handler, Handler:handle_event({key, ?end_seq(Acc)}, State)}, [key|Stack], Opts);
|
||||||
maybe_done(Rest,
|
[Acc, single_quote|Stack] ->
|
||||||
{Handler, Handler:handle_event({string, ?end_seq(Acc)}, State)},
|
maybe_done(Rest, {Handler, Handler:handle_event({string, ?end_seq(Acc)}, State)}, Stack, Opts);
|
||||||
Stack,
|
[Acc|Stack] ->
|
||||||
Opts
|
string(Rest, {Handler, State}, [?acc_seq(Acc, ?singlequote)|Stack], Opts)
|
||||||
);
|
end;
|
||||||
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(<<?rsolidus/utf8, Rest/binary>>, Handler, Stack, Opts) ->
|
string(<<?rsolidus/utf8, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
escape(Rest, Handler, Stack, Opts);
|
escape(Rest, Handler, Stack, Opts);
|
||||||
%% things get dumb here. erlang doesn't properly restrict unicode non-characters
|
%% things get dumb here. erlang doesn't properly restrict unicode non-characters
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue