【发布时间】:2020-10-05 23:59:29
【问题描述】:
我想为具有引用同一类的字段的案例类制作编组器。
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] 也没有隐式
【问题讨论】:
-
cats-effect 与此有什么关系?
Encoder来自哪里? 圆? -
@LuisMiguelMejíaSuárez,是的 io.circe
-
类层次结构是
sealed吗? Circe 需要密封的层次结构才能隐式创建编码器/解码器。 -
您无法获得
Encoder[String,Any],但您也不需要它。当它不是null时,只需重用treeNodeEncoder以递归编码parentNode。但是 circe 也应该能够开箱即用地做到这一点。 -
@LuisMiguelMejíaSuárez,我不需要任何东西,我只是学习,所以欢迎任何选择。非常感谢这个,我已经学会了自定义编码。你提供的这种方式我只是不喜欢那个空的 parentNode 仍然在 json 中显示为 null。是否有任何选项可以让它缺席,只是
{"name":"root"}而不是{"name":"root","parentNode":null}?
标签: scala marshalling circe