3

我正在尝试概括用于从 Play 操作返回 Json 的功能之一。

我目前这样做:

def JsendOkObj(obj: JsValue) = Ok(Json.obj("status" -> "success", "data" -> obj))

并称之为:

JsendOkObj(Json.toJson(myObj))

我想做更多类似的事情:

def JsendOkObj[A](obj: A) = Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)))

然后像这样称呼它:

JsendOkObj(myObj)

其中Json.toJson定义

def toJson[A](implicit arg0: Writes[A]): Enumeratee[A, JsValue]

我编译这个错误是我需要为 type 定义一个 Writes A。这是不可能的,因为我不知道哪种类型A最终会成为:

找不到类型 A 的 Json 反序列化器。尝试为此类型实现隐式写入或格式。

4

1 回答 1

12

您可以通过将隐式参数列表添加到您自己的方法来确保Writes[A]在调用时隐式将在范围内,如下所示:toJSon

def JsendOkObj[A](obj: A)(implicit w: Writes[A]) =
  Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)))

这相当于将类型类实例显式传递给toJson

def JsendOkObj[A](obj: A)(implicit w: Writes[A]) =
  Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)(w)))

请注意,您还可以在此处使用上下文绑定

def JsendOkObj[A: Writes](obj: A) =
  Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)))

这只是我上面第一个版本的语法糖。

于 2013-01-29T11:38:08.830 回答