sjsonで再帰構造を扱うとき

sjsonでProtocolを定義するときにはFormatを簡単に書けるasProduct?なメソッドが使えるが、再帰構造のときは単純に書くとシリアライズで例外が出るようだ(デシリアライズは試してない)。
lazyFormatを使うとうまくやってくれるみたい。

case class DirectoryItem(name: String, files: List[FileItem], directories: List[DirectoryItem])

implicit val DirectoryItemFormat: Format[DirectoryItem] =
  lazyFormat(asProduct3("name", "files", "directories")(DirectoryItem)(DirectoryItem.unapply(_).get))

https://github.com/debasishg/sjson/blob/master/src/test/scala/sjson/json/Protocols.scala