我试图概括我用于从 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
是 defined作为:def toJson[A](implicit arg0: Writes[A]): Enumeratee[A, JsValue]
我编译这个的错误是我需要为类型
A
定义一个 Writes| .这是不可能的,因为我不知道是哪种类型 A
实际上最终会是:No Json deserializer found for type A. Try to implement an implicit Writes or Format for this type.
最佳答案
您可以确保隐式 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)))
请注意,您也可以使用 a context bound这里:
def JsendOkObj[A: Writes](obj: A) =
Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)))
这只是我上面第一个版本的语法糖。
关于scala - 带有隐式参数的泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14581757/