2013-02-05 26 views
6

次の2つのことがあります。Jsonフォーマッタが見つかりませんでした。Scala、Playフレームワークエラー

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は "formatOptは[のObjectId]。ライン "(__ \" _id)"、それは上の次の不満を続け、コンパイル時に定義されているものの

型org.bson.types見つかり

ませんJSONフォーマッタ.ObjectId。このタイプの暗黙の フォーマットを実装してみてください。

バージョン:2.1-RC2を再生し、Scalaの2.10

それはreadObjectIdFormatを認識していない理由を任意のアイデア?

答えて

0

Format[T] extends Reads[T] with Writes[T]
Formatは+を書く読み取りです。

implicit val formatObjectIdFormat = 
    Format(readObjectIdFormat, writeObjectIdFormat) 
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(...) 
} 

それとも、(それをテストしていませんが、私はこれは、読み取りのために働くと仮定注意してください)読み代わりの形式を使用する必要があります。 documentationから

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

その他の代わりにフォーマットを使用し、良い答えを与えた後、暗黙のwriteObjectIdFormatを書きます。ところで、あなたは解析エラーを処理することができます。

この実装は、私のために正常に動作している:

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

    } 
関連する問題