Build up the JSON hash manually.

When we rely on ActiveModel::Serialization's default functionality, it
includes the `errors` and `validation_context` attributes set by the
validation code. The need API rejects these as unknown keys, as it
should.