如何使用Dispatch解析JSON请求?

7

我正在学习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个回答

5
你应该从dispatch.liftjson.Js._中导入。
使用特征并不是有帮助的,因为你并没有使用它。 JS._ 导入会将JS对象的所有内容都引入到你的作用域中,包括 隐式转换 requestToJsonVerbs,它来自于 trait ImplicitJsonVerbs。这个方法将标准的Dispatch 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]
})))

如您所见,我已经导入了正确的库(还有一些Lift库),然后我的Request就拥有了一个>#方法。我将>#赋予了一个匹配预期签名((JValue) ⇒ T)的函数,然后我们就可以开始了。
如果您想知道,我特别使用了lift-json提取到case类的能力,这意味着T将是Device。但是,如果lift-json无法将JValue转换为Device,它也会抛出异常,因此我用Helper.tryo来包装整个请求,这是一个Lift帮助方法,它包装了一个try-catch调用,并返回一个BoxBox类似于标准的ScalaOption,但增加了Failure,表示为什么Box为空。因此,在这种情况下,我将得到一个Full[Device]Failure。很方便!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接