Я хочу сделать маршаллер для класса case, поля которого относятся к одному и тому же классу.
case class TreeNode (name: String, parentNode: Option[TreeNode])
если я сделаю сериализатор
implicit val nodeJson = jsonFormat2(TreeNode)
я получаю сообщение об ошибке, что для параметра Option[TreeNode] не найдено имплицитов. Есть ли способ решить эту проблему, кроме написания сериализации с нуля?
PS Еще несколько попыток, которые я сделал с кодировщиком
private def toNode (node: TreeNode): Map[String, Any] = {
val parent = node.parentNode.map(toNode).orNull
Map[String, Any] ("name" -> node.name, "parentNode" -> parent)
}
implicit val treeNodeEncoder: Encoder[TreeNode] =
Encoder.forProduct2("name", "parentNode")(n =>
(n.name, n.parentNode.map(toNode).orNull)
)
это тоже не работает, потому что Map[String, Any] также не имеет неявного
Encoder? круг? - person Luis Miguel Mejía Suárez   schedule 05.10.2020sealed? Circe нужна закрытая иерархия, чтобы иметь возможность неявно создавать кодировщики/декодеры. - person francoisr   schedule 05.10.2020Encoder[String,Any], но он вам и не нужен. Просто повторно используйтеtreeNodeEncoderдля рекурсивного кодированияparentNode, когда это неnull. Но circe должна уметь делать это и из коробки. - person francoisr   schedule 05.10.2020{"name":"root"}вместо{"name":"root","parentNode":null}? - person Dmitry Reutov   schedule 05.10.2020