Maybe this won’t help, but anyway…
I succeeded in adding a watcher to an issue in JIRA 7.0. To get it to work, I used HTTPie to submit the request, which failed with a 400 BAD REQUEST, as yours did, and then I edited the request in my debugging proxy (Charles) so that the body contains only a string. The raw content of the successful request was as follows:
POST /jira/rest/api/2/issue/ABC-7/watchers HTTP/1.1
Accept-Encoding: gzip, deflate
Authorization: Basic ***************
Is a lone string even valid JSON? I dunno.