6

私は定義された再帰的なクラスを持っています:

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] 

怠惰な読み取り/書き込み/フォーマットラッパーを定義しようとしましたが、成功しませんでした...誰もそれを行うためのクリーンな方法を知っていますか?

4

3 に答える 3

9

お気づきのように、ここでは 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です。

于 2015-06-08T15:07:56.220 に答える