> The names within an object SHOULD be unique.
RFC2119 §3
> [SHOULD], or the adjective "RECOMMENDED", mean that there may exist valid reasons in particular circumstances to ignore a particular item, but the full implications must be understood and carefully weighed before choosing a different course.
Not allowing duplicate keys in JSON objects is very close the exact opposite of a gotcha. Allowing and round-tripping them would be a gotcha.
select '{"foo": 1, "foo": 2}'::json; json ---------------------- {"foo": 1, "foo": 2} (1 row)
select '{"foo": 1, "foo": 2}'::jsonb; jsonb ------------ {"foo": 2} (1 row)
So technically, the gotcha is you have to remember to use jsonb instead of json, as well as json having a true "gotcha" and jsonb not having one.
mydb=# select
('{"foo": 1, "foo": 2}'::jsonb)->'foo' jsonb_foo,
('{"foo": 1, "foo": 2}'::json)->'foo' json_foo;
jsonb_foo|2
json_foo|2What, exactly, do you think should happen if you have an object of the form
{ task: "do stuff", task: "do other stuff" }
? Objects in JSON are key-value pairs. A single key goes to a single value. Instead, you should map task to an array of values.Coercing data types is surely more wrong than taking the most recently supplied value for a given key in a map.
duplicate properties are not allowed. I.E.:
{ task: "do stuff", task: "do other stuff" }
which sometimes is useful when you have front-end data with an N-number of entries but its a form that serializes to an object instead of an array. There are other use cases too.