邮件列表的案例类对象

时间:2015-08-08 12:19:44

标签: scala spray spray-json

我想根据我的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'

2 个答案:

答案 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

的提取示例