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 _)
}

Так что это работает, но это очень уродливое решение. Есть лучший способ это сделать?

Заранее спасибо:)

0 ответов

Другие вопросы по тегам