如何为树状案例类制作编组?

问题描述

我想为案例类创建编组器,该案例类的字段引用相同的类。

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]也没有隐式

解决方法

假设您要尝试通过circe进行此操作,这是一个有效的示例:


import io.circe.{Encoder,Decoder}
import io.circe.generic.semiauto.{deriveEncoder,deriveDecoder}
import io.circe.syntax._

final case class TreeNode (name: String,parentNode: Option[TreeNode])

object TreeNode {
  implicit val encoder: Encoder[TreeNode] = deriveEncoder
  implicit val decoder: Decoder[TreeNode] = deriveDecoder
}

val a = TreeNode("a",None)
val b = TreeNode("b",Some(a))
val c = TreeNode("c",Some(b))

println(c.asJson)

输出

{
  "name" : "c","parentNode" : {
    "name" : "b","parentNode" : {
      "name" : "a","parentNode" : null
    }
  }
}

还要注意,从叶子而不是根开始代表树木是不寻常的。

,

感谢大家的帮助,只是为了使它成为我发现的又一种方法,以及如何在必要时手动进行

implicit val treeNodeEncoder: Encoder[TreeNode] = new Encoder[TreeNode] {
    def apply(a: TreeNode): Json = {
      val list = List(
        ("name" -> Json.fromString(a.name)),("parentNode" -> a.parentNode.map(this.apply).orNull),).filterNot(_._2 == null)

      Json.obj(list: _*)
    }
  }

这样,我们可以避免将parentNode写入null,如果它为None则跳过它

,

圆圈支持此功能,您只需要使用库提供的semiautomatic / automatic derivation机制即可。
您还可以修改要用于控制标识的打印机,以及是否要添加// Get the pointer let drawingPtr = sqlite3_column_blob(statement,2)! // Get the length let drawingLength = Int(sqlite3_column_bytes(statement,2)) // Copy the bytes into a new Data let drawing = Data(bytes: drawingPtr,count: drawingLength) // Now construct your Canvas. result.append(Canvas(id: Int(sqlite3_column_int(statement,0)),date: Date_date,drawing: drawing))

看一下这段代码:

nulls

您可以看到它正在运行here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...