2015-06-08 5 views
5

Ich habe eine rekursive-Klasse definiert:Json implizites Format mit rekursive Klassendefinition

case class SettingsRepository(id: Option[BSONObjectID], 
          name: Option[String], 
          children: Option[List[SettingsRepository]]) 

mit einem JSON impliziten Format wie folgt:

implicit val repositoryFormat = Json.format[SettingsRepository] 

Wie kann ich diese Zusammenstellung Fehler zu beheben tun? :

No implicit format for Option[List[models.practice.SettingsRepository]] available. 
In /path/to/the/file.scala:95 

95 implicit val repositoryFormat = Json.format[SettingsRepository] 

Ich habe versucht, einen faulen liest/Schreiben/Format-Wrapper ohne Erfolg ... Wer weiß, eine saubere Art und Weise zu definieren, das zu tun?

Jede Hilfe wird geschätzt;

Vielen Dank im Voraus.

Antwort

6

Wie Sie entdeckt haben, können Sie nicht die JSON Anfang Makro hier verwenden, aber Sie können Ihre eigene Format (beachten Sie, dass ich BSONObjectID mit Long im Interesse eines vollständigen Arbeitsbeispiel ersetzt haben) schreiben:

Der Trick besteht darin, einen expliziten Typ Annotation und implicitly statt nur einen Typparameter auf lazyFormatNullable bereitzustellen.

+0

Vielen Dank! Es funktioniert perfekt! – Xan

0

Für andere, die hier kam eine leichte Variante, wo wir reads und writes in der Formatklasse (wie die example given auf die API-Dokumentation) außer Kraft setzen, können Sie einen faulen Bezug auf Ihre benötigten Objekt deklarieren:

lazy val tweetFormat: Format[Tweet] = TweetFormat 
    implicit object UserFormat extends Format[User] { 
    //... 
    } 

    //... 
    implicit object TweetFormat extends Format[Tweet] { 
    //...