2013-02-05 12 views
6

Mam następujące dwa implikacje.Brak formatera Json znalezionego Scala, błąd struktury gry

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) 

Choć readObjectIdFormat jest określona w czasie kompilacji to wciąż skarży się na następujące "(__ \ "_id"). FormatOpt [ObjectId]" linia

Nie znaleziono Json formater typu org.bson.types .ObjectId. Spróbuj zaimplementować domyślny format dla tego typu.

wersje: Play 2.1 RC2, Scala 2,10

jakiś pomysł, dlaczego to nie uznając readObjectIdFormat?

Odpowiedz

0

Od documentation: Format[T] extends Reads[T] with Writes[T]
Format jest odczytu + napisać.

Napisz niejawny writeObjectIdFormat następnie

implicit val formatObjectIdFormat = 
    Format(readObjectIdFormat, writeObjectIdFormat) 
2

Wykonujesz implementację Reads i potrzebujesz zamiast tego implementować 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(...) 
} 

Albo musisz użyć read zamiast formatu (uwaga Zakładam, że działa to dla odczytu, nie przetestowałem go).

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

Dzięki. To było to. Po nurkowaniu dalej w dokumentach i makrach przy użyciu zwięzłej i czytelnej wersji jako niejawny val visitorReadFormat = Json.reads [Visitor] –

3

Inne dał dobrą odpowiedź, zamiast używać formatu. Przy okazji, możesz obsługiwać błędy analizy.

Implementacja ta działa dobrze dla mnie:

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

    } 
Powiązane problemy