【问题标题】:No Json serializer as JsObject found for type play.api.libs.json.JsValue找不到类型 play.api.libs.json.JsValue 的 Json 序列化程序作为 JsObject
【发布时间】:2015-12-20 18:26:05
【问题描述】:

我正在尝试将我的项目从使用 play2-reactivemongo 版本 0.10.5.0.akka23 迁移到使用版本 0.11.7.play23。我已经添加了以下导入来解决this question 中解决的问题:

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 我希望有一个神奇的导入,它会添加我缺少的所需的隐式转换。创建您建议的函数仍然需要我更改代码中所有出现的Json.parse,因此我认为在任何地方添加.as[JsObject] 并没有多大优势。

标签: scala playframework playframework-2.0 reactivemongo play-reactivemongo


【解决方案1】:

刚刚也被这个咬了。诀窍是删除

import play.modules.reactivemongo.json._

改为使用

import reactivemongo.play.json._

play.modules 版本不提供身份 OWriter。

【讨论】:

    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多