将自定义案例类的客户端编组喷射到JSON

时间:2013-09-08 02:28:02

标签: json scala marshalling akka spray

我有以下暗示:

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit val impStartObjSys = jsonFormat3(StartObj.Sys)
  implicit val impStartObjData = jsonFormat6(StartObj.Data)
  implicit val impStartObjStart = jsonFormat3(StartObj.Start)
}

它适用于Spray路由器,我通常可以将一个对象解组为StartObj.Start(它接受一个字符串,sys和数据作为输入参数)

现在我正在尝试使用spray-client编写负载测试并执行JSON请求。不幸的是,它不想接受我的对象作为输入参数,错误:

  

[error] Load.scala:85:找不到类型> spray.httpx.marshalling.Marshaller [models.StartObj.Start]类型的证据参数的隐含值   [错误]管道(Post(serverHost,newUser))   [错误] ^

我开始创建一个解决此问题的编组器:

  implicit val StartObjMarshaller =
    Marshaller.of[Start](ContentTypes.`application/json`) 
    { (value, contentType, ctx) ⇒ 
       ctx.marshalTo(HttpEntity(contentType, value))
    }

但是在这里它抱怨价值不是受支持的类型。它只需要字节数组或字符串。我需要String但是在Json格式中,我应该如何编写这个marshaller以便它正确解决问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

好的,我想出来了。我需要添加此导入以支持json编组:

import spray.httpx.SprayJsonSupport._

之后编组功能将是:

  implicit def StartObjMarshaller[T](implicit writer: RootJsonWriter[T], 
      printer: JsonPrinter = PrettyPrinter) =
  Marshaller.delegate[T, String](ContentTypes.`application/json`) { value ⇒
    val json = writer.write(value)
    printer(json)
  }