#scala #playframework
#scala #playframework
Вопрос:
У меня есть настройка класса признака / случая, например:
sealed trait Vehicle
case class Honda(...) extends Vehicle
case class Toyota(...) extends Vehicle
case class VehicleSet(bestSeller: Vehicle, others: Seq[Vehicle])
Когда я пишу чтение для VehicleSet, он говорит
"No Json deserializer found for type Vehicle. Try to implement an implicit reads or Format this type"
object VehicleJsonFormats {
implicit val hondaWrites ...
implicit val toyotaWrites ...
implicit val vehicleSetWrites ...
implicit val hondaReads ...
implicit val tototaReads ...
implicit val vehicleSetReads: Reads[VehicleSet] = (
(JsPath "bestSeller").read[Vehicle] and
(JsPath "other").read[Seq[Vehicle]]
) (VehicleSet.apply _)
}
Я в замешательстве, как это будет работать с признаком?
Комментарии:
1. Вы пытались написать неявный считыватель внутри Object VehicleSet?
2. @HendrikT неявный считыватель для чего, признака транспортного средства?
3. Да, вам нужно создать считыватель для вашего транспортного средства :
implicit val vehicleReads: Reads[Vehicle] = ???
. Вам понадобится некоторый код, чтобы взять ваш json и преобразовать его в ваш экземпляр vehicle:Honda
илиToyota
. Это будет зависеть от того, как вы можете отличить свои транспортные средства от объектов json.4. @vdebergue но транспортное средство — это признак. У меня уже есть неявные чтения как для Honda, так и для Toyota.
Ответ №1:
Вам нужно Reads[Vehicle]
что-то вроде:
implicit val vehicleReads: Reads[Vehicle] = Reads[Vehicle] {
case json: JsObject =>
(json "make").asOpt[String] match {
case Some("Honda") => hondaReads.reads(json)
case Some("Toyota") => toyotaReads.reads(json)
case _ => JsError("Vehicle expected")
}
case _ => JsError("JsObject expected")
}