惰性格式化递归 JSON 类型找不到作为隐式值
Lazy formatted recursive JSON type can't be found as implicit value
我正在使用 Spray 构建 REST API。
我的 JSON 数据类型之一是递归的:
case class Container(id: String,
name: String,
read_only: Boolean,
containers: List[Container],
content: List[Content])
object PeriusJsonProtocol extends DefaultJsonProtocol {
implicit val contentFormat = jsonFormat8(Content)
implicit val containerFormat: JsonFormat[Container] = lazyFormat(jsonFormat5(Container))
}
在 HttpService 中完成路由时出现以下错误:
Error:(49, 18) could not find implicit value for parameter um: spray.httpx.unmarshalling.FromRequestUnmarshaller[Container]
entity(as[Container]) { container =>
^
Error:(49, 18) not enough arguments for method as: (implicit um: spray.httpx.unmarshalling.FromRequestUnmarshaller[Container])spray.httpx.unmarshalling.FromRequestUnmarshaller[Container].
Unspecified value parameter um.
entity(as[Container]) { container =>
^
HttpService 如下所示:
import akka.actor.Actor
import spray.routing._
import spray.httpx.SprayJsonSupport._
import PeriusJsonProtocol._
class RestServiceActor extends Actor with RestService {
def actorRefFactory = context
def receive = runRoute(projectsRoute)
}
// this trait defines our service behavior independently from the service actor
trait RestService extends HttpService {
private val PROJECTS = "projects"
val projectsRoute =
path(PROJECTS) {
get {
complete(MongoUtil.getAll(PROJECTS, META) map ContainerMap.fromBson)
//complete(Container("test", "name", false, List(), List()))
} ~ post {
entity(as[Container]) {
//complete(MongoUtil.insertProject(container))
complete(container)
}
}
}
}
GET
中的 complete
有效,即使该函数 returns 是容器列表。然而,get
中注释掉的行不起作用,并且无法隐式转换 post
中的 Container,如错误消息中所示。我应该怎么做才能使容器隐式工作并仍然保持其递归结构?
容器 class 是根级别 json 因此您需要将相应的隐式更改为:
implicit val containerFormat: RootJsonFormat[Container] = rootFormat(lazyFormat(jsonFormat5(Container)))
我正在使用 Spray 构建 REST API。 我的 JSON 数据类型之一是递归的:
case class Container(id: String,
name: String,
read_only: Boolean,
containers: List[Container],
content: List[Content])
object PeriusJsonProtocol extends DefaultJsonProtocol {
implicit val contentFormat = jsonFormat8(Content)
implicit val containerFormat: JsonFormat[Container] = lazyFormat(jsonFormat5(Container))
}
在 HttpService 中完成路由时出现以下错误:
Error:(49, 18) could not find implicit value for parameter um: spray.httpx.unmarshalling.FromRequestUnmarshaller[Container]
entity(as[Container]) { container =>
^
Error:(49, 18) not enough arguments for method as: (implicit um: spray.httpx.unmarshalling.FromRequestUnmarshaller[Container])spray.httpx.unmarshalling.FromRequestUnmarshaller[Container].
Unspecified value parameter um.
entity(as[Container]) { container =>
^
HttpService 如下所示:
import akka.actor.Actor
import spray.routing._
import spray.httpx.SprayJsonSupport._
import PeriusJsonProtocol._
class RestServiceActor extends Actor with RestService {
def actorRefFactory = context
def receive = runRoute(projectsRoute)
}
// this trait defines our service behavior independently from the service actor
trait RestService extends HttpService {
private val PROJECTS = "projects"
val projectsRoute =
path(PROJECTS) {
get {
complete(MongoUtil.getAll(PROJECTS, META) map ContainerMap.fromBson)
//complete(Container("test", "name", false, List(), List()))
} ~ post {
entity(as[Container]) {
//complete(MongoUtil.insertProject(container))
complete(container)
}
}
}
}
GET
中的 complete
有效,即使该函数 returns 是容器列表。然而,get
中注释掉的行不起作用,并且无法隐式转换 post
中的 Container,如错误消息中所示。我应该怎么做才能使容器隐式工作并仍然保持其递归结构?
容器 class 是根级别 json 因此您需要将相应的隐式更改为:
implicit val containerFormat: RootJsonFormat[Container] = rootFormat(lazyFormat(jsonFormat5(Container)))