我正在尝试通过像这样使用plays json库来更改此功能的实现
def apply[T](action: => ApiResponse[T])(implicit tjs: Writes[T], ec: ExecutionContext): Future[Result] = {
action.fold(
err =>
Status(err.statusCode) {
JsObject(Seq(
"status" -> JsString("error"),
"statusCode" -> JsNumber(err.statusCode),
"errors" -> Json.toJson(err.errors)
))
},
t =>
Ok {
JsObject(Seq(
"status" -> JsString("ok"),
"response" -> Json.toJson(t)
))
}
)
}
像这样使用 argonaut
def apply[T](action: => ApiResponse[T])(implicit encodeJson: EncodeJson[T], ec: ExecutionContext): Future[Result] = {
action.fold(
err =>
Status(err.statusCode) {
Json(
"status" -> jString("error"),
"statusCode" -> jNumber(err.statusCode),
"errors" -> err.errors.asJson
)
},
t =>
Ok {
Json(
"status" -> jString("ok"),
"response" -> t.asJson
)
}
)
}
但我明白了
无法将 argonaut.Json 的实例写入 HTTP 响应。尝试定义一个 Writeable[argonaut.Json]
对于 Status{} 块和 Ok{} 块,我在这里得到了这个问题的有用答案https://groups.google.com/forum/#!topic/play-framework/vBMf72a10Zc
所以我尝试像这样创建隐式转换
implicit def writeableOfArgonautJson(implicit codec: Codec): Writeable[Json] = {
Writeable(jsval => codec.encode(jsval.toString))
}
我认为将 json 对象转换为字符串并将其提供给 codec.encode 应该将其转换为 Array[Bytes] 但我得到了
无法猜测用于 argonaut.Json 的内容类型。尝试定义一个 ContentTypeOf[argonaut.Json]
jsval.nospaces.getBytes 也返回 Array[Bytes] 所以我不知道这是否可以用来提供帮助
所以虽然我认为最后一条错误消息意味着我只需要告诉 play 它应该使用内容类型 application.json 我也觉得这可能是一个不必要的兔子洞,应该有一个更简单的方法来做到这一点。
编辑:它不是一个兔子洞,因为定义 contentType 至少可以编译,但我仍然想知道这是否正确