4
コンテキストスカラPlayJson循環参照
私はそうのような自体を指す階層の項目である場合クラスがある:
case class Node(
name: String,
children: Option[Seq[Node]] = None
)
私はこのためPlayJson Format
したいです。
通常、あなただけ行うことができます。
implicit lazy val formatter = Json.format[MyCaseClass]
しかし、これは動作しません。
なぜですか?それが終わる、それはそれはまだ構築されていないNode
のための既存のフォーマッタを探しますフィールドchildren
になるとき
PlayJsonは、それはすべてのフィールドを通過します、ケースクラスのFormat
を生成するためにScalaのマクロを使用していますコンパイルエラーで:
No implicit format for Option[Seq[Node]] available.
[error] implicit lazy val formatter = Json.format[Node]
質問
これにアプローチする最良の方法は何ですか?
これはPlayJson形式のマクロの既知の問題ですか?
import play.api.libs.functional.syntax._
import play.api.libs.json.{Reads, Writes, _}
case class Node(name: String, children: Option[Seq[Node]] = None)
implicit lazy val nodeReads: Reads[Node] = (
(__ \ "name").read[String] and
(__ \ "children").lazyReadNullable(Reads.seq[Node](nodeReads))
)(Node)
implicit lazy val nodeWrites: Writes[Node] = (
(__ \ "name").write[String] and
(__ \ "children").lazyWriteNullable(Writes.seq[Node](nodeWrites))
)(unlift(Node.unapply))
Reads
とWrites
は対称的であるような場合には、あなたは、単一のFormat
として全体を作成することができますので、::
賢明、ポインタありがとう! –
私の編集を見て、全体が少し短くなる可能性があります。 –
マクロに内部化されるべきもののようです。私はまだ自分のマクロでScalaで遊んでいません。 Scalaマクロに固有の何かがありますが、これは不可能ですか? –