Рассмотрим этот класс случаев
case class Location(val name: String, val id: Option[Long] = None)
Я могу написать "toJson" так:
implicit val locationWrites: Writes[Location] = (
(JsPath \ "name").write[String] and
(JsPath \ "id").write[Option[Long]]
) (unlift(Location.unapply))
но я борюсь с "fromJson":
implicit val locationReads: Reads[Location] = (
(JsPath \ "name").read[String]
) (Location.apply _, None)
Объяснение: на самом деле идентификатор должен быть установлен уровнем сохраняемости, поэтому я не хочу указывать его вручную.
Я также пробовал:
implicit val locationReads: Reads[Location] = (
(JsPath \ "name").read[String] and
(JsPath \ "id").read[Option[Long]]
) (Location.apply _)
но, к сожалению, тогда я получаю:
Не найден десериализатор Json для типа Option[Long]. Попробуйте реализовать неявное чтение или формат для этого типа.
Мне действительно нужно создать имплицит для этого?
Как это работает (например: компилируется)? Я спрашиваю, потому что это абсолютно тривиально для людей, но вдруг появляется неявное, и оно компилируется. Не уверен, что это вообще имеет смысл, но боюсь, что нет.
implicit val optionalLongReads: Reads[Option[Long]] = (
(JsPath \ "optional").read[Option[Long]]
)
edit: определенно не имеет смысла.
Если я отправлю curl --include --request POST --header "Content-type:application/json" --data '{"name": "Gondor", "id": "2"}' localhost:9000
, я получу:
HTTP/1.1 500 Внутренняя ошибка сервера
Content-Length: 8029
Content-Type: text/html; charset=utf-8
Дата: суббота, 08 октября 2016 г., 21:49:51 по Гринвичу
Я тоже не могу оставить id пустым :(