2013-02-05 40 views
6

我有以下兩個implicits。沒有Json格式化程序找到Scala,玩框架錯誤

implicit val readObjectIdFormat = new Reads[ObjectId] { 
def reads(jv: JsValue): JsResult[ObjectId] = { 
    JsSuccess(new ObjectId(jv.as[String])) 
} 
} 

implicit val visitorFormat = (
(__ \ "_id").formatOpt[ObjectId] and 
(__ \ "visitorId").format[String] and 
(__ \ "referralUrl").formatOpt[String] and 
(__ \ "ipAddress").formatOpt[String] and 
(__ \ "promotionId").format[String])(Visitor) 

雖然readObjectIdFormat是在編譯時它一直抱怨以下的 「(__ \ 」_id「)。formatOpt [的ObjectId]」 線限定

找到的類型org.bson.types

否的Json格式化.ObjectId。嘗試實現此類型的隱式 格式。

版本:播放2.1 RC2,斯卡拉2.10

任何想法,爲什麼它不承認readObjectIdFormat?

回答

0

documentationFormat[T] extends Reads[T] with Writes[T]
Format讀+寫

寫一個隱含writeObjectIdFormat然後

implicit val formatObjectIdFormat = 
    Format(readObjectIdFormat, writeObjectIdFormat) 
2

您正在實施Reads,您需要改爲執行Format。或者您需要使用讀取而不是格式(注意我假設這適用於讀取,沒有測試過)。

implicit val visitorRead = (
(__ \ "_id").readOpt[ObjectId] and 
(__ \ "visitorId").read[String] and 
(__ \ "referralUrl").readOpt[String] and 
(__ \ "ipAddress").readOpt[String] and 
(__ \ "promotionId").read[String])(Visitor) 
+0

感謝。就是這樣。在深入研究文檔和宏時,使用簡潔和更具可讀性的版本作爲隱式val visitorReadFormat = Json.reads [Visitor] –

3

其他給了很好的回答,請使用Format代替。順便說一句,你可以處理解析錯誤。

這實現了我工作的罰款:

implicit val objectIdFormat: Format[ObjectId] = new Format[ObjectId] { 

    def reads(json: JsValue) = { 
     json match { 
     case jsString: JsString => { 
      if (ObjectId.isValid(jsString.value)) JsSuccess(new ObjectId(jsString.value)) 
      else JsError("Invalid ObjectId") 
     } 
     case other => JsError("Can't parse json path as an ObjectId. Json content = " + other.toString()) 
     } 
    } 

    def writes(oId: ObjectId): JsValue = { 
     JsString(oId.toString) 
    } 

    }