【问题标题】:scala: define a Type that has defined a certain implicitscala:定义一个已经定义了某个隐式的类型
【发布时间】:2012-08-24 23:13:56
【问题描述】:

我想定义一个泛型类型 T 的函数,其中 T 有某个方法的隐式实现

事实上,我正在努力实现以下目标:

我有很多类似这样的重复代码:

def update(id: Long) = CORSAction { implicit request =>
  request.body.asJson.map { json =>
    json.asOpt[Wine].map { wine =>
      wine.copy(id=Id(id)).update.fold(
        errors => JsonBadRequest(errors),
        wine => Ok(toJson(wine).toString)
      )
    }.getOrElse       (JsonBadRequest("Invalid Wine entity"))
  }.getOrElse         (JsonBadRequest("Expecting JSON data"))
}

所以,检查它是否是一个有效的 json 然后解析它是我想封装在一个函数中的一个非常常见的任务。

对于 wine 类型,我定义了一个隐式 JsonWineFormatter,它实现了一个写入和读取方法以从 json 解析并呈现为 json 一个 wine 对象

object WineFormatter {

  implicit object JsonWineFormatter extends Format[Wine] {

    def writes(o: Wine): JsValue = {
      toJson( Map(
        "id"          -> toJson(o.id),
    [...]

    def reads(j: JsValue): Wine = {
      Wine(
        id = (j \ "id").as[Option[Pk[Long]]] 
    [...]

所以我试图定义一个像这样的通用方法:

def parse[T](implicit request: Request[AnyContent]): Option[T] = {
  request.body.asJson.map { json =>
    json.asOpt[T].map { entity =>
      entity
    }
  }
}

但我收到以下错误:

没有找到类型 T 的 Json 反序列化器。尝试为此类型实现隐式读取或格式化。

我需要指定泛型类型 T 需要和隐式读取...

你知道如何实现吗?

--

编辑:我尝试了以下内容:

import play.api.libs.json.JsValue
type EntityWithJsonFormatter[T] = T {def reads(j: JsValue): T}

def parse[T: EntityWithJsonFormatter](request: Request[AnyContent]): Option[T] = {
  request.body.asJson.map { json =>
    json.asOpt[T].map { entity =>
      entity
    }
  }
}

但显然,不是 T 应该实现读取,而是应该有一个隐式对象来实现它。我不知道如何在类型中指定它...

【问题讨论】:

    标签: scala types playframework-2.0


    【解决方案1】:

    JsValue 文档定义了asOpt

    def asOpt [T] (implicit fjs: Reads[T]): Option[T] 
    

    所以如果你import play.api.libs.json.Reads 那么

    def parse[T: Reads]( ...
    

    应该可以解决问题。

    【讨论】:

    • 不管是否实现了 opts 的格式,我仍然很好奇你将如何定义一个通用函数并将 T 传递给 Json.fromJson[T] 而没有得到'No Json反序列化器发现类型 T' 错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多