如何使用Dispatch解析JSON请求?

时间:2011-06-02 21:43:21

标签: scala scala-dispatch

我正在学习Scala,并试图了解特征是如何工作的(特别是使用Dispatch库)。

我有这样的事情:

import dispatch._
import dispatch.liftjson._

object Foo
{
    def main(cmd: Array[String])
    {
        val http = new Http;
        val req = :/("example.com") / path ># (list ! obj);
        val res = http(req);
    }
}

不幸的是,它抱怨>#未在dispatch.Request中注册。在dispatch.liftjson中描述了这个特征,并且我的假设是我只需要导入该特征(应该覆盖它)以便注册。

1 个答案:

答案 0 :(得分:5)

您应该从dispatch.liftjson.Js._导入。

有一个特性是没有用的,因为你还没有使用它。 JS._导入会将JS对象的所有内容带入您的范围,包括来自requestToJsonVerbs的{​​{3}} trait ImplicitJsonVerbs。此方法会将您从Request获得的标准调度:/("example.com") / path转换为JsonVerbs,其方法为>#

以下是我如何查询API的简略示例:

import dispatch._
import dispatch.liftjson.Js._

import net.liftweb.common.{Box, Failure, Full}
import net.liftweb.util.Helpers

case class Device(device_token: String, alias: Option[String])

val req = devicesReq / device_token as (app_token, secret)
Helpers.tryo(http(req ># (json => {
  json.extract[Device]
})))

正如您所看到的,我有正确的导入(加上我喜欢的某些implicit conversion库的一些导入),而我的Request然后'有'>#方法。我给>#一个与预期签名((JValue) ⇒ T)匹配的函数,然后我们离开。

如果你想知道,我特意使用lift-json提取到案例类的能力,这意味着T将是Device。但是,如果无法将JValue转换为Device,lift-json也会抛出异常,所以我用Helper.tryo包裹了我的整个请求,这是一个包裹的Lift辅助方法一个try-catch调用,返回BoxBox与标准Scala Option类似,但添加了Failure,表示Box为空的原因。因此,在这种情况下,我会获得Full[Device]Failure。方便!