我正在尝试概括我用于从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
实际上最终会成为:
找不到类型A的Json反序列化器。尝试为此类型实现隐式写入或格式。
答案 0 :(得分: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)))
请注意,您也可以在此处使用a context bound:
def JsendOkObj[A: Writes](obj: A) =
Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)))
这只是我上面第一个版本的语法糖。