1

这是一个简单的任务,可能是一种幼稚的方法。获取符合条件的所有文件。对于文件,我指的是文件元数据——而不是二进制文件。

for {
    files <- gfs.find(BSONDocument("metadata.ideaId" -> BSONObjectID(ideaId))).collect[Seq]()
} yield {

    Ok(Json.toJson(files))
}

我在范围内有 reactivemongo.api.gridfs.Implicits._ 但我得到了

No Json deserializer found for type Seq[reactivemongo.api.gridfs.ReadFile[reactivemongo.bson.BSONValue]]
4

2 回答 2

4

我为这个任务使用了非常简单的手工序列化器:

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))))
}
于 2014-04-07T09:55:03.803 回答
1

您尝试将 Seq[reactivemongo.api.gridfs.ReadFile[reactivemongo.bson.BSONValue]] 的“文件”序列化为 JSON,这是开箱即用的。您必须为其提供一个隐式 JSON 序列化程序(作为 play.api.libs.json.Writes[Seq[ReadFile[BSONValue]]] 的一个实例)。

http://www.playframework.com/documentation/2.1.3/ScalaJson

有一节 'Converting a Scala value to JsValue' 描述了细节。

于 2014-04-04T15:07:27.800 回答