Idem potency
Following the RFC, a PUT would have to deliver full object to the resource. The main reason of this, is that PUT should be idempotent. This means a request, which is repeated should evaluate to the same result on the server.
If you allow partial updates, it cannot be idem-potent anymore. If you have two clients. Client A and B, then the following scenario can evolve:
Client A gets a picture from resource images. This contains a description of the image, which is still valid. The client B puts a new image and update the description accordingly. The picture has changed. Client A sees, he doesn't have to change the description, because it is as he wishes and put only the image.
This will lead to an inconsistency, the image has the wrong metadata attached!
Even more annoying is that any intermediary can repeat the request. In case it decides somehow the PUT failed.
The meaning of PUT cannot be changed (although you can misuse it).
Other options
Luckily there is a another option, this is PATCH. PATCH is a method which allows you to partially update a structure. You can simply send an partial structure. For simple applications, this is fine. This method is not guaranteed to be idem potent. The client should send a request in the following form:
PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 20
{fielda: 1, fieldc: 2}
And the server can reply back with 204 (No content) to flag success. On error you cannot update a part of the structure. The PATCH method is atomic.
The disadvantage of this method is, is that not all browsers support this, but this is the most natural option in a REST-service.
Example patch request:
https://www.rfc-editor.org/rfc/rfc5789#section-2.1
Json patching
The json option seems to be pretty comprehensive and an interesting option. But it can be difficult to implement for third parties. You have to decide if your user base can handle this.
It is also somewhat convoluted, because you need to build an small interpreter which converts the commands to an partial structure, which you are going to use to update your model. This interpreter should also check, if the provided commands make sense. Some commands cancel each other out. (write fielda, delete fielda). I think you want to report this back to the client to limit debug time on his/her side.
But if you have the time, this is a really elegant solution. You still should validate the fields of course. You can combine this with the PATCH method to stay into the REST model. But I think POST would be acceptable to here.
Going bad
If you decide to go with the PUT option, which is somewhat risky. Then you should at least not discard the error. The user has a certain expectancy (the data will be updated) and if you break this, you are going to give some developers not a good time.
You could chose for flagging back: 409 Conflict or a 403 Forbidden. It depends how you look at the update process. If you see it as a set of rules (system-centric), then conflict will be nicer. Something like, these fields are not updateable. (In conflict with the rules). If you see it as an authorization problem (user-centric), then you should return forbidden. With: you aren't authorized to change these fields.
You still should force users to send all the modifiable fields.
A reasonable option to enforce this is to set it to a sub-resource, which only offers the modifiable data.
Personal opinion
Personally I would go (if you don't have to work with browsers) for the simple PATCH model and then later extend it with a JSON patch processor. This can be done by differentiating on the mimetypes:
The mime type of json patch:
application/json-patch
And json:
application/json-patch
makes it easy to implement it in two phases.