我为这个任务使用了非常简单的手工序列化器:
import play.api.libs.json._
import play.api.libs.json.Json._
import reactivemongo.api.gridfs.ReadFile
import reactivemongo.bson.{BSONValue, BSONObjectID}
implicit val fileWrites = new Writes[ReadFile[BSONValue]] {
def writes(file: ReadFile[BSONValue]): JsValue = {
val id = file.id.asInstanceOf[BSONObjectID].stringify
obj(
"_id" -> id, // need it with underscore
"name" -> file.filename,
"url" -> routes.Files.serveFile(id).url, // app specific
"thumbnailUrl" -> routes.Files.serveFile(id).url, // app specific
"extension" -> file.filename.split('.').last,
"contentType" -> file.contentType,
"size" -> file.length,
"uploadDate" -> file.uploadDate,
"deleteUrl" -> "", // app specific
"deleteType" -> "DELETE"
)
}
}
所以你可以像这样使用它:
import helpers.Formats.fileWrites // your package here
def all = Action.async { request =
gfs.find(query).collect[List]() map {
case files: List[ReadFile[BSONValue]] => Ok(prettyPrint(obj("files" -> toJson(files))))
}