喷json编组

时间:2014-06-09 09:08:59

标签: json marshalling unmarshalling spray spray-json

我正在寻求创建一个JSON API,其中一些模型可以很好地推广。我是Spray的新手,所以我用一个简单的例子开始了一个尖峰。

但是我无法弄清楚波纹管代码发生了什么......

我已经导入了两个

  • 我的自定义暗示和
  • spray.httpx.SprayJsonSupport._

据我所知,这是我必须做的,以便有一个隐含的范围,可以从JsonFormat转换为Marshaller。

编译错误:

  

TestService.scala:15:找不到参数um的隐含值:spray.httpx.unmarshalling.FromRequestUnmarshaller [my.company.Test [my.company.X]]

代码:

package my.company

import spray.routing.HttpService
import spray.json.{JsValue, JsObject, JsonFormat, DefaultJsonProtocol}


trait TestService extends HttpService {

  import my.company.TestImplicits._
  import spray.httpx.SprayJsonSupport._

  val test =
    path("test") {
      post {
        entity(as[Test[X]]) {
          test => {
            complete(s"type: ${test.common}")
          }
        }
      }
    }
}

trait Common {
  def commonData: String
}

case class X(id: Long, commonData: String) extends Common
case class Y(commonData: String) extends Common

case class Test[T <: Common](comment: String, common: T)

object TestImplicits extends DefaultJsonProtocol {

  implicit val xFormat = jsonFormat2(X)
  implicit val yFormat = jsonFormat1(Y)

  implicit val yTestFormat: JsonFormat[Test[Y]] = new JsonFormat[Test[Y]] {
    def write(test: Test[Y]) = JsObject()
    def read(js: JsValue) = Test("test", Y("y"))
  }

  implicit val xTestFormat: JsonFormat[Test[X]] = new JsonFormat[Test[X]] {
    def write(test: Test[X]) = JsObject()
    def read(js: JsValue) = Test("test", X(1L, "y"))
  }
}

我将不胜感激任何帮助。提前谢谢。

解决

解决方案是(正如@jrudolp建议的那样):

  • 在文件顶部移动隐式定义(令人惊讶)
  • 创建RootJsonFormat而不是JsonFormat。

0 个答案:

没有答案