Я пытаюсь перенести свой проект с play2-reactivemongo
версии 0.10.5.0.akka23
на версию 0.11.7.play23
. Я уже добавил следующий импорт, чтобы исправить проблемы, адресованные в this question:Нет Json serializer as JsObject для типа play.api.libs.json.JsValue
import play.modules.reactivemongo.json._
С предыдущей версией, следующий код работает:
val updateEntity = Json.obj("_id" -> Json.obj("$oid" -> id))
val entity = Json.parse(stringJson)
collection.update(updateEntity, entity)
однако, с помощью новой версии, то третья строка дает ошибку компиляции:
[error] No Json serializer as JsObject found for type play.api.libs.json.JsValue. Try to implement an implicit OWrites or OFormat for this type.
[error] collection.update(updateEntity, entity)
[error] ^
Я попытался введение неявного OWriter
:
implicit val toJsObject: OWrites[JsValue] = OWrites.apply(_.as[JsObject])
но дает неявную декларацию конфликт:
[error] ambiguous implicit values:
[error] both value toJsObject of type play.api.libs.json.OWrites[play.api.libs.json.JsValue]
[error] and object JsObjectDocumentWriter in trait ImplicitBSONHandlers of type play.modules.reactivemongo.json.JsObjectDocumentWriter.type
[error] match expected type collection.pack.Writer[play.api.libs.json.JsObject]
[error] collection.update(updateEntity, entity)
[error] ^
меняющемуся вторую строчку в
val entity = Json.parse(stringJson).as[JsObject]
исправляет проблему, но у меня есть много их вокруг моего кода, и я надеялся, для более простого решения.
Почему бы не написать функцию типа 'def parseJson (json: String) = {Json.parse (json) .as [JsObject]}' и использовать эту функцию вместо этого. – curious
@curious Я надеялся на магический импорт, который добавит требуемые неявные преобразования, которые мне не хватает. Создание функции, которую вы предложили, по-прежнему потребует от меня изменить все вхождения 'Json.parse' в моем коде, и с этим я действительно не вижу большого преимущества просто добавлять' .as [JsObject] 'везде. –