Scala play Json - читает конвертер с параметром типа - PullRequest
0 голосов
/ 02 октября 2019

Я хотел бы создать конвертер операций чтения JSON с параметром типа, например так:



case class AClass(name: String, age: Int)
case class AClass(name: String)

object GeneralReadsType extends Enumeration {
  type GeneralReadsType = Value
  val AReadType = Value("atype")
  val BReadType = Value("btype")
}

implicit val repoReads: Reads[GeneralReadsType.GeneralReadsType] = {

  GeneralReadsType match {
    case GeneralReadsType.AReadType => (
      (JsPath \ "name").read[String] and
        (JsPath \ "age").read[Int]
      ) (GeneralReadsType.AReadType.apply _)


    case GeneralReadsType.BReadType => (
      (JsPath \ "name").read[String]
      ) (GeneralReadsType.BReadType.apply _)

  }
}

Но когда я пытаюсь использовать его в

def getResponse[GeneralReadsType](request: WSRequest): Future[List[GeneralReadsType]] = {
      request.get().map {
        case response if response.status == 200 => {
          (response.json).validate[List[GeneralReadsType]] match {
            case JsSuccess(items: List[GeneralReadsType], _) => items
            case _: JsError => List[GeneralReadsType]()
          }
        }
        case _ => List[GeneralReadsType]()
      }
    }


getResponse[AReadType](request)

, я получаю ошибку компиляции

Не найден десериализатор Json для типа List [GeneralReadsType]. Попробуйте реализовать неявное чтение или форматирование для этого типа.

Итак, как этого достичь?

Спасибо!

1 Ответ

0 голосов
/ 02 октября 2019

Я считаю, что лучше всего размещать объекты форматирования в виде неявного поля в самом объекте (или в сопутствующем объекте класса case). Также при использовании формы множественного числа Enumeration для объекта Enumeration и единственного числа для значения сделайте его лучше читаемым. Итак:

object GeneralReadsTypes extends Enumeration {
  type GeneralReadsType = Value
  val AReadType = Value("atype")
  val BReadType = Value("btype")

  implicit val repoReads: Reads[GeneralReadsType] = {
    ((JsPath \ "name").read[String] and
      (JsPath \ "age").readNullable[Int]).apply { (_, maybeAge) =>
      maybeAge.fold(BReadType)( _ => AReadType)
    }
  }  
}

или если вы находите функциональный стиль чуждым:

object GeneralReadsTypes extends Enumeration {
  type GeneralReadsType = Value
  val AReadType = Value("atype")
  val BReadType = Value("btype")

  implicit val repoReads: Reads[GeneralReadsType] = {
    ((JsPath \ "name").read[String] and
      (JsPath \ "age").readNullable[Int]).apply { (_, maybeAge) =>
      if (maybeAge.isDefined) AReadType
      else BReadType
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...