Как написать метод чтения признака

#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")
}