我正在构建一个非常简单的服务,它应该返回一个通过递归案例类定义的树状结构:
case class Node(id: Int, name: String, children: Seq[Node] = Seq())
但由于某种原因,我不断收到以下编译错误:
错误:(24, 70) 找不到参数编码器的隐含值:io.circe.Encoder[Seq[com.ansarada.ds.docviewer.server.Main.Node]]
隐式验证节点编码器:EntityEncoder[Seq[Node]] = jsonEncoderOf[序列[节点]]错误:(24, 70) 方法 jsonEncoderOf 的参数不足:(隐式编码器:io.circe.Encoder[Seq[com.ansarada.ds.docviewer.server.Main.Node]])org.http4s.EntityEncoder[Seq[ com.ansarada.ds.docviewer.server.Main.Node]]。未指定值参数编码器。隐式验证节点编码器:EntityEncoder[Seq[Node]] = jsonEncoderOf[Seq[Node]]
代码被编译,一旦我删除了一个子元素定义并将一个节点变成一个平面对象:
case class Node(id: Int, name: String)
任何人都可以帮我为嵌套孩子的情况定义正确的 Json 编码器吗?
完整代码:
import org.http4s.circe._
import org.http4s.dsl._
import org.http4s.server.blaze.BlazeBuilder
import org.http4s.server.{Server, ServerApp}
import org.http4s.{EntityEncoder, HttpService}
import scalaz.concurrent.Task
object Main extends ServerApp {
import io.circe.generic.auto._
import io.circe.syntax._
case class Node(id: Int, name: String, children: Seq[Node] = Seq())
def getNodes: Seq[Node] = Seq(
Node(0, "#One"),
Node(1, "#Two"),
Node(2, "#Three")
)
implicit val nodeEncoder: EntityEncoder[Node] = jsonEncoderOf[Node]
implicit val nodesEncoder: EntityEncoder[Seq[Node]] = jsonEncoderOf[Seq[Node]]
override def server(args: List[String]): Task[Server] = {
val nodesService = HttpService {
case _ @ GET -> Root / "nodes" =>
Ok(getNodes.asJson)
}
BlazeBuilder
.bindHttp(8080, "localhost")
.mountService(nodesService, "/api")
.start
}
}