【问题标题】:getting serealizing case class with play json library使用 play json 库获取 serealizing 案例类
【发布时间】:2017-12-25 21:07:36
【问题描述】:

我的案例类如下所示:

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)

为了能够在我的控制器中找到一个人,我为 person 添加了 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:/隐式val BankInfoFormat: OFormat[BankInfo] = Json.format[BankInfo]

有些东西很奇怪……据我所知它应该可以工作

【问题讨论】:

  • 这意味着问题出在代码 implicit val RouterInvoiceDataFormat: OFormat[BankInfo] = Json.format[BankInfo] 中的其他地方。与您在此处显示的代码无关。您需要在此行所在的任何位置导入 BankInfo 序列化程序。

标签: scala playframework playframework-2.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)))
    }
  }

【讨论】:

  • 仍然无法解决我的问题,修复了所有的排序问题,但不是这样,No unapply or unapplySeq function found for class 这很奇怪
  • 检查编辑更改。你的行为就是我所看到的错误在哪里。
猜你喜欢
  • 2017-08-23
  • 2021-06-27
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
相关资源
最近更新 更多