问题描述
我想为案例类创建编组器,该案例类的字段引用相同的类。
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