1

我試圖將我的項目從play2-reactivemongo版本0.10.5.0.akka23遷移到使用版本0.11.7.play23。我已經添加了以下進口來修復this question解決的問題:No Json序列化程序爲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] 

修復這個問題,但我有很多的這些在我的代碼,我希望爲更簡單的解決方案。

+1

爲什麼不寫一個像'def parseJson(json:String)= {Json.parse(json).as [JsObject]}'這樣的函數,而是使用這個函數。 – curious

+0

@curious我很希望有一個神奇的導入,它會添加我缺少的隱式轉換。創建你所建議的函數仍然需要我在代碼中改變所有出現的'Json.parse',並且我認爲只要在每個地方添加'.as [JsObject]'都沒有多大好處。 –

回答

0

剛剛得到了這一點。關鍵是要去除

import play.modules.reactivemongo.json._ 

,而使用

import reactivemongo.play.json._ 

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