0

对于 url 编码的 POST 的参数,您将如何实现 String 到 json 对象解组器?我正在使用 1.2 版。

这就是我想要的。Foursquare 将 url 编码的 POST 推送到我的服务。我的路线看起来像这样

  path("handle_4sq_push") {
    formFields("checkin".as[FsqCheckin], "user".as[String], "secret".as[String]) {
      (checkin, user, secret) =>
        complete {
          StatusCodes.OK
        }
    }
  } 

我有 json 解析器,FsqCheckin它的定义如下

  implicit val fsqCheckinFormat = jsonFormat(FsqCheckin.apply, "id", "createdAt", "timeZoneOffset", "user", "venue")

所以这一切都很好,但它只有在参数被表单编码时才有效。否则喷雾说

There was a problem with the requests Content-Type:
Field 'checkin' can only be read from 'multipart/form-data' form content

所以我想我会写 unmarshaller。我写了这个

  implicit def MyJsonUnmarshaller[T: RootJsonReader] =
    Unmarshaller.delegate[String, T](ContentTypes.`*`) {
      value => {
        val json = JsonParser(value)
        json.convertTo[T]
      }
    }

但是如果我把它带到我的路线范围内,我会得到以下编译错误

too many arguments for method formFields: (fdm: spray.routing.directives.FieldDefMagnet)fdm.Out
        formFields("checkin".as[FsqCheckin], "user".as[String], "secret".as[String]) {
                  ^

如果范围内没有 json 解析器,这与我遇到的错误相同FsqCheckin

我该如何处理这个问题?

4

1 回答 1

1

令人震惊的是,我自己弄清楚了。这是通用解组器的工作版本。

implicit def String2JsonParser[T: RootJsonReader] = new FromStringDeserializer[T] {
  def apply(value: String) =
    try
      Right(JsonParser(value).convertTo[T])
    catch {
      case ex: Throwable => Left(spray.httpx.unmarshalling.MalformedContent(ex.getMessage))
    }
}
于 2013-08-03T04:18:39.357 回答