私はこの関数の実装を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)
))
}
)
}
そのようにアルゴノートを使用するには
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]に変換すると思いますが、
アルゴナウト.Json に使用するコンテンツ タイプを推測できません。ContentTypeOf[argonaut.Json] を定義してみてください
jsval.nospaces.getBytes も Array[Bytes] を返すため、それがまったく役立つかどうかはわかりません
したがって、最後のエラー メッセージは、コンテンツ タイプ application.json を使用する必要があることをプレイに伝える必要があることを意味していると思いますが、これは不必要なウサギの穴である可能性があり、これを行うためのより簡単な方法があるはずです。
編集: contentType を定義することで、少なくともコンパイルが行われるようなうさぎの穴ではありませんでしたが、これが正しいかどうかはまだ知りたいです