So, do you have a suggestion?
I do, and it's buried in there:
Case 1 just seems wrong. The "add" in 1a should be an error, and then
life would make sense.
Turning that into a text suggestion, it would be this (which
represents a change to the protocol, so the working group would have
to accept it):
OLD
When the operation is applied, the target location MUST reference one
of:
o The root of the target document - whereupon the specified value
becomes the entire content of the target document.
o A member to add to an existing object - whereupon the supplied
value is added to that object at the indicated location. If the
member already exists, it is replaced by the specified value.
NEW
When the operation is applied, the target location MUST reference one
of:
o A member to add to an existing object - whereupon the supplied
value is added to that object at the indicated location. It is an error
for the specified member to already exist.
END
OLD
For example, "add"ing to the path "/a/b" to this document:
{ "a": { "foo": 1 } }
is not an error, because "a" exists, and "b" will be added to its
value. It is an error in this document:
{ "q": { "bar": 2 } }
because "a" does not exist.
NEW
For example, given the following starting document:
{ "a": { "foo": 1 } }
o "add"ing to the path "/a/b" is not an error, because "/a" exists,
and "b" will be added to its value.
o "add"ing to the path "/q/b" is an error, because "/q" does not
exist. But "/q" can be added first, followed by "add"ing "/q/b".
o "add"ing to the path "/a" or "/a/foo" is an error, because "/a"
and "/a/foo" both exist already, and cannot be added.
END
I understand that this will change implementations -- patches that
used to use "add" will now have to use "replace", and there's now no
way to do "add this if it's not already there, and replace it if it is
already there". Perhaps there's a need to add something with those
semantics. On the other hand, as the text stands now, there's no way
to do "add this only if it's not already there", because "test" can't
test for existence.
Barry