BSON to Play Поддержка JSON для длинных значений
Я начал использовать библиотеки play-json/play-json-compat с reactivemongo 0.20.11.
Поэтому я могу использовать чтение / запись JSON Play при импорте пакета reactivemongo.play.json._, а затем легко извлекать данные из JSONCollection вместо BSONCollection. В большинстве случаев это отлично работает, но для длинных полей нет:(
Например:
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 _)
}
Так что это работает, но это очень уродливое решение. Есть лучший способ это сделать?
Заранее спасибо:)