如何使用Dispatch解析JSON请求?

Dav*_*mer 7 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

pr1*_*001 5

你应该从中导入dispatch.liftjson.Js._.

有特点是没有用的,因为你没有使用它.该JS._进口将带来的所有内容JS物到你的范围,包括隐式转换 requestToJsonVerbs,它具有从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]
})))
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我有正确的导入(加上我喜欢的一些Lift库的一些),然后我的Request'有'一个>#方法.我给出>#了一个匹配预期签名((JValue) ? T)的函数,然后我们去了.

如果你想知道,我特意使用lift-json的功能来提取到案例类,这意味着T将会Device.但是,如果它无法将转换JValue为a Device,则lift-json也会引发异常,所以我用Helper.tryo一个包含try-catch调用的Lift辅助方法包装了我的整个请求,返回一个Box.Box就像标准的Scala,Option但添加了Failure,这表明为什么a Box是空的.所以,在这种情况下,我会得到一个Full[Device]或一个Failure.便利!