2015-06-08 114 views
5

隱格式我已經定義了一個遞歸類:的Json遞歸類定義

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

有如下一個JSON格式隱:

implicit val repositoryFormat = Json.format[SettingsRepository] 

我該怎麼做才能解決這個編譯錯誤? :

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

95 implicit val repositoryFormat = Json.format[SettingsRepository] 

我試圖定義一個懶惰的讀取/寫入/格式的包裝沒有任何成功... 任何人都知道一個乾淨的方式來做到這一點?

任何幫助將不勝感激;

預先感謝您。

回答

6

正如你已經發現,你不能在這裏使用JSON以來宏,但你可以編寫自己的Format(請注意,我把它換成BSONObjectIDLong一個完整的工作示例的緣故):

import play.api.libs.functional.syntax._ 
import play.api.libs.json._ 

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

implicit val repositoryFormat: Format[SettingsRepository] = (
    (__ \ 'id).formatNullable[Long] and 
    (__ \ 'name).formatNullable[String] and 
    (__ \ 'children).lazyFormatNullable(implicitly[Format[List[SettingsRepository]]]) 
)(SettingsRepository.apply, unlift(SettingsRepository.unapply)) 

訣竅是提供一個明確的類型註釋,並使用implicitly而不僅僅是lazyFormatNullable上的類型參數。

+0

非常感謝!它完美的工作! – Xan

0

對於其他人誰來到這裏尋找一個微小的變異,我們在格式類(如example given的API文檔)覆蓋readswrites,你可以宣佈延遲引用到你需要的對象:

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

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