Я пытаюсь изменить реализацию этой функции, используя библиотеку play 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], поэтому я не знаю, можно ли это вообще использовать для помощи
поэтому, хотя я думаю, что последнее сообщение об ошибке означает, что мне просто нужно сказать игре, что он должен использовать тип контента application.json, я также чувствую, что это может быть ненужной кроличьей норой, и должен быть более простой способ сделать это.
редактировать: это не было такой кроличьей норой, как определение contentType имеет компиляцию, по крайней мере, но я все же хотел бы знать, правильно ли это
.nospaces
возвращает JSON в виде строки, вы можете передать егоOk(js.nospaces).as("application/json")
- person cchantep   schedule 02.02.2015