ensure last key 'wins' in the value decoder
This commit is contained in:
parent
100f707899
commit
f699bdeedc
1 changed files with 36 additions and 5 deletions
|
@ -143,8 +143,21 @@ collect({jsx, incomplete, More}, Acc, Opts) ->
|
||||||
%% else, an object
|
%% else, an object
|
||||||
collect({jsx, Event, Next}, [Current|Rest], Opts) when is_list(Current) ->
|
collect({jsx, Event, Next}, [Current|Rest], Opts) when is_list(Current) ->
|
||||||
collect(Next(), [[event(Event, Opts)] ++ Current] ++ Rest, Opts);
|
collect(Next(), [[event(Event, Opts)] ++ Current] ++ Rest, Opts);
|
||||||
|
%% delete any prior uses of current key
|
||||||
collect({jsx, Event, Next}, [Key, Current|Rest], Opts) ->
|
collect({jsx, Event, Next}, [Key, Current|Rest], Opts) ->
|
||||||
collect(Next(), [[{Key, event(Event, Opts)}] ++ Current] ++ Rest, Opts);
|
case proplists:is_defined(Key, Current) of
|
||||||
|
true ->
|
||||||
|
Acc = proplists:delete(Key, Current),
|
||||||
|
collect(Next(),
|
||||||
|
[[{Key, event(Event, Opts)}] ++ Acc] ++ Rest,
|
||||||
|
Opts
|
||||||
|
)
|
||||||
|
; _ ->
|
||||||
|
collect(Next(),
|
||||||
|
[[{Key, event(Event, Opts)}] ++ Current] ++ Rest,
|
||||||
|
Opts
|
||||||
|
)
|
||||||
|
end;
|
||||||
%% any other event is an error
|
%% any other event is an error
|
||||||
collect(_, _, _) -> erlang:error(badarg).
|
collect(_, _, _) -> erlang:error(badarg).
|
||||||
|
|
||||||
|
@ -380,9 +393,8 @@ encode_test_() ->
|
||||||
},
|
},
|
||||||
{"float", ?_assert(term_to_json(1.0, []) =:= <<"1.0">>)},
|
{"float", ?_assert(term_to_json(1.0, []) =:= <<"1.0">>)},
|
||||||
{"naked string",
|
{"naked string",
|
||||||
?_assert(term_to_json(<<"hello world">>,
|
?_assert(term_to_json(<<"hello world">>, [])
|
||||||
[]
|
=:= <<"\"hello world\"">>
|
||||||
) =:= <<"\"hello world\"">>
|
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{"strict mode", ?_assertError(badarg, term_to_json(true,
|
{"strict mode", ?_assertError(badarg, term_to_json(true,
|
||||||
|
@ -391,6 +403,25 @@ encode_test_() ->
|
||||||
)}
|
)}
|
||||||
].
|
].
|
||||||
|
|
||||||
|
repeated_keys_test_() ->
|
||||||
|
[
|
||||||
|
{"simple repeated key",
|
||||||
|
?_assert(json_to_term(<<"{\"a\":false,\"a\":true}">>, [])
|
||||||
|
=:= [{<<"a">>, true}]
|
||||||
|
)
|
||||||
|
},
|
||||||
|
{"nested repeated key",
|
||||||
|
?_assert(json_to_term(<<"[{\"a\":false,\"a\":true},{\"a\":false,\"a\":true}]">>, [])
|
||||||
|
=:= [[{<<"a">>, true}], [{<<"a">>, true}]]
|
||||||
|
)
|
||||||
|
},
|
||||||
|
{"multiple keys",
|
||||||
|
?_assert(json_to_term(<<"{\"a\":4,\"a\":3,\"a\":2,\"a\":1}">>, [])
|
||||||
|
=:= [{<<"a">>, 1}]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
].
|
||||||
|
|
||||||
escape_test_() ->
|
escape_test_() ->
|
||||||
[
|
[
|
||||||
{"json string escaping",
|
{"json string escaping",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue