通过播放json库获得实现案例类

时间:2017-07-20 09:04:21

标签: scala playframework playframework-2.0

我的案例类如下所示:

case class Person(personalInfo: PersonalInfo, bankInfo: BankInfo)

case class PersonalInfo(fname: String, lname: String)
case class BankInfo(atmCode: Int, creditCard: CreditCard)
case class CreditCard(number: Int, experationDate: String)

所以为了能够在我的控制器中找到一个人,我为这个人添加了serealizer:

object PersonSerealizer {

  implicit val PersonalInfoFormat: OFormat[PersonalInfo] = Json.format[PersonalInfo]
  implicit val CreditCardFormat: OFormat[CreditCard] = Json.format[CreditCard]
  implicit val BankInfoFormat: OFormat[BankInfo] = Json.format[BankInfo]
  implicit val PersonFormat: OFormat[Person] = Json.format[Person]

}

在我的控制器中,我有一个超级简单的动作,如下所示:

mport serializers.PersonSerealizer._

def getBrothers(): Action[JsValue] = Action.async(parse.json) { request =>
    request.body.validate[Person] match {
      case JsSuccess(person, _) => 
        brothersService.getBrothers(person) // this returns a List[Person]
        .map(res => Future{Ok(res)})
      case JsError(errors) => Future(BadRequest("Errors! " + errors.mkString))
    }
  }

但是我收到了这个错误:

  

错误:(23,81)没有为类找到unapply或unapplySeq函数   BankInfo:/ implicit val BankInfoFormat:   OFormat [BankInfo] = Json.format [BankInfo]

某些东西很奇怪......据我知道它应该起作用

1 个答案:

答案 0 :(得分:1)

定义你的暗示的顺序似乎很重要。此外,我认为使用伴随对象更安全,而不是在任意对象内定义它们。

  case class PersonalInfo(fname: String, lname: String)
  object PersonalInfo {
    implicit val personalInfoJsonFormat = Json.format[PersonalInfo]
  }

  case class CreditCard(number: Int, experationDate: String)
  object CreditCard {
    implicit val creditCardJsonFormat = Json.format[CreditCard]
  }

  case class BankInfo(atmCode: Int, creditCard: CreditCard)
  object BankInfo {
    implicit val bankInfoJsonFormat = Json.format[BankInfo]
  }

  case class Person(personalInfo: PersonalInfo, bankInfo: BankInfo)
  object Person {
    implicit val personJsonFmt = Json.format[Person]
  }

  // Your action will be like this
  def getBrothers() = Action.async(parse.json) { req =>
    req.body.validate[Person] match {
      case JsSuccess(p, _) => 
        Future.successful(Ok(Json.toJson(service.getBrothers(p))))
      case JsError(errors) => 
        Future.successful(BadRequest(JsError.toJson(errors)))
    }
  }