2

我已经开始使用带有 reactivemongo 0.20.11 的 play-json/play-json-compat 库。

因此,我可以在导入“reactivemongo.play.json._”包时使用 JSON Play 读/写,然后轻松地从 JSONCollection 而不是 BSONCollection 获取数据。在大多数情况下,这很有效,但对于 Long 字段,它不会:(

例如:

case class TestClass(name: String, age: Long)

object TestClass {
  implicit val reads = Json.reads[TestClass]
}

如果我尝试使用以下函数进行查询:

def getData: Map[String, TestClass] = {
  val res = collection.find(emptyDoc)
    .cursor[TestClass]()
    .collect[List](-1, Cursor.ContOnError[List[TestClass]] { case (_, t) =>
      failureLogger.error(s"Failed deserializing TestClass from Mongo", t)
    })
    .map { items =>
      items map { item =>
        item.name -> item.age
      } toMap
    }
  Await.result(res, 10 seconds)
}

然后我收到以下错误:

play.api.libs.json.JsResultException: JsResultException(errors:List((/age,List(ValidationError(List(error.expected.jsnumber),WrappedArray())))))

我调试了文档的读取,注意到当它首先将 BSON 转换为 JsObject 时,长字段如下:

"age": {"$long": 1526389200000}

我找到了一种方法来完成这项工作,但我真的不喜欢它:

case class MyBSONLong(`$long`: Long)

object MyBSONLong {
  implicit val longReads = Json.reads[MyBSONLong]
}

case class TestClass(name: String, age: Long)

object TestClass {
  implicit val reads = (
    (__ \ "name").read[String] and
      (__ \ "age").read[MyBSONLong].map(_.`$long`)
    ) (apply _)
}

所以这行得通,但这是一个非常丑陋的解决方案。有一个更好的方法吗?

提前致谢 :)

4

0 回答 0