6

私は次の2つの暗黙を持っています。

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フォーマッターが見つかりません。このタイプの暗黙的なフォーマットを実装してみてください。

バージョン:Play 2.1-RC2、Scala 2.10

readObjectIdFormatを認識しない理由はありますか?

4

3 に答える 3

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

  }
于 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 に答える