我有以下两个含义。
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?
答案 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)
来自documentation:Format[T] extends Reads[T] with Writes[T]
Format
是读取+写入。
写一个隐式的writeObjectIdFormat然后
implicit val formatObjectIdFormat =
Format(readObjectIdFormat, writeObjectIdFormat)