0

我正在使用 play-json 将传入的 json 序列化为案例类,例如来自 sqs 源或来自 api 调用。

它是一个非常简单的 JsonSerialization 类,我在需要的地方导入它:

object JsonSerialization {
  implicit val StatusFormat: Format[Status] = EnumFormats.formats(Status)
  implicit val PersonFormat: OFormat[Person] = Json.format[Person]
}

但现在我想知道,根据我对 Dao 的理解,需要将我的案例类序列化为 BSON ,因为我的 Dao 获取了案例类,并且当我从某些东西中获取反序列化到我的案例类时。我只在 Dao 中导入:

import reactivemongo.play.json.compat.json2bson.{toDocumentReader, toDocumentWriter}
import serializers.JsonSerialization._

并找到并插入完美的作品,

  def insert(person: Person): Future[Person] = {
    val writeRes: Future[WriteResult] = collection.insert.one(person)

    writeRes.onComplete {
      case Failure(e) => e.printStackTrace()
      case Success(writeResult) =>
        logger.info(s"successfully inserted person")
    }

    writeRes map { _ => person }
  }


  def find(name: String): Future[Person] = {
    collection.find(BSONDocument(
      "name" -> name
    )).requireOne[Person]
  }

你能告诉我道中哪个部分负责什么吗?我有点困惑

抱歉,如果这是一个初学者问题,但得到简短的解释会很有帮助

4

1 回答 1

0

我正在使用带有 ReactiveMongo 1.0 的 Play 框架 2.8。我通常做的是,

1.对收藏进行查找。

这将返回一些 BSONDocuments,您需要提供 BSON 阅读器和编写器来将 BSONDocuments 转换为您的案例类/从您的案例类转换。您可以在此处查看一些教程和示例。然后,您可以使用以下代码进行一些通用查询:

    for {
        c <- database.map(_.collection(collectionName))
        r <- c.find(selector.getOrElse(BSONDocument()), projection)
            .sort(sorter.getOrElse(BSONDocument()))
            .cursor[T]().collect[List](Int.MaxValue, Cursor.FailOnError[List[T]]())
    } yield r

2.以JSON形式返回查询结果

当您检索到查询结果时,您可以使用 Json.toJson() 以 JSON 格式返回它们,这将隐式调用案例类的JSON 读取器/写入器。

Person.find().map {
    item => {
        Ok(Json.toJson(item))
    }
}

我没有使用 bson2json,我想它有助于在幕后将案例类转换为 JSON。

于 2021-01-27T09:43:35.903 回答