没有Json格式化程序发现Scala,Play框架错误

时间:2013-02-05 04:13:59

标签: scala playframework

我有以下两个含义。

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]”line

找不到类型为org.bson.types.ObjectId的Json格式化程序。尝试实现隐式 此类型的格式。

版本:播放2.1-RC2,Scala 2.10

知道为什么它不能识别readObjectIdFormat?

3 个答案:

答案 0 :(得分: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)
    }

  }

答案 1 :(得分: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(...)
}

或者您需要使用read而不是format(注意我认为这适用于读取,尚未测试)。

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

答案 2 :(得分:0)

来自documentationFormat[T] extends Reads[T] with Writes[T]
Format读取+写入

写一个隐式的writeObjectIdFormat然后

implicit val formatObjectIdFormat = 
   Format(readObjectIdFormat, writeObjectIdFormat)