2015-06-08 70 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] { 
    //...