我想根据我的case类对象返回json对象列表。
以下是我的喷涂路由器,它返回'约会'对象列表。
trait GatewayService extends HttpService with SLF4JLogging {
import com.sml.apigw.protocols.AppointmentProtocol._
import spray.httpx.SprayJsonSupport._
implicit def executionContext = actorRefFactory.dispatcher
val router =
pathPrefix("api" / "v1") {
path("appointments") {
get {
complete {
val a = new Appointment("1", "2")
val l = List(a, a, a, a)
l
}
}
}
}
}
}
以下是'AppointmentProtocol'
import spray.json.DefaultJsonProtocol
case class Appointment(id: String, patient: String)
object AppointmentProtocol extends DefaultJsonProtocol {
implicit val appointmentFormat = jsonFormat2(Appointment.apply)
}
它给出了编译错误'List [Appointment]的表达式类型没有确认到期望的类型toResponseMarshallable'
答案 0 :(得分:1)
也许你错过了你的例子,但我的基于大脑的编译器告诉我你的代码应该抛出一个编译错误,因为Spray中的任何指令都需要Route
类型的结果,因为我可以看到你有一个List[Appointment]
。请阅读有关路线的this文章。您的路线结构应该使用complete
完成,因此我假设这种方式可以解决您的问题:
get {
val a = new Appointment("1", "2")
val l = List(a, a, a, a)
complete(l)
}
请注意包含列表的complete
指令。这应该有所帮助,否则请通过使用标记-Xprint:typer
编译代码来为树提供已解决的含义,该标记应显示带有问题的位置。
答案 1 :(得分:-1)
我认为您应该使用此库spray-json,具体取决于您的spay版本,这将是您的导入,并且不要忘记将导入添加到您的代码中:
import MyJsonProtocol._
import spray.json._
确保您已导入:
libraryDependencies += "io.spray" %% "spray-json" % "1.3.2"
你可以转换一个这样的对象,我也有问题在同一个文件中使用case类但是这是使用测试:
case class Color(name: String, red: Int, green: Int, blue: Int)
object MyJsonProtocol extends DefaultJsonProtocol {
implicit val colorFormat = jsonFormat4(Color)
}
import MyJsonProtocol._
import spray.json._
val json = Color("CadetBlue", 95, 158, 160).toJson
val color = json.convertTo[Color]
和列表:
val jsonAst = List(1, 2, 3).toJson
这是来自spray-json github project
的提取示例