6

我有以下两个隐式。

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.ObjectId 的 Json 格式化程序。尝试为此类型实现隐式格式。

版本:播放 2.1-RC2,Scala 2.10

知道为什么它无法识别 readObjectIdFormat 吗?

4

3 回答 3

3

其他人给出了很好的答案,请改用格式。顺便说一句,您可以处理解析错误。

这个实现对我来说很好用:

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

  }
于 2013-04-14T17:06:59.820 回答
2

您正在实施Reads,而您需要实施Format

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

 def writes(o: A): JsValue = JsString(...)
}

或者您需要使用读取而不是格式(注意我假设这适用于读取,尚未测试)。

implicit val visitorRead = (
(__ \ "_id").readOpt[ObjectId] and
(__ \ "visitorId").read[String] and
(__ \ "referralUrl").readOpt[String] and
(__ \ "ipAddress").readOpt[String] and
(__ \ "promotionId").read[String])(Visitor)  
于 2013-02-05T06:56:59.117 回答
0

文档Format[T] extends Reads[T] with Writes[T]
Format是一个读+写

然后写一个隐式 writeObjectIdFormat

implicit val formatObjectIdFormat = 
   Format(readObjectIdFormat, writeObjectIdFormat)
于 2013-02-05T09:27:40.967 回答