我定义了一个递归类:

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]
我试图定义一个懒惰的读取/写入/格式包装器,但没有成功...
有人知道这样做的干净方法吗?

最佳答案

正如您所发现的,您不能在此处使用JSON inception宏,但是您可以编写自己的Format(请注意,为了完整的工作示例,我已用BSONObjectID替换了Long):

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上的一个类型参数。

10-06 13:56