如何在lift项目中使用dispatch.json

时间:2010-09-17 01:24:12

标签: scala lift scala-dispatch

我对如何在调度和提升中组合json库以解析我的json响应感到困惑。

我显然是斯卡拉新手。

我写了这段代码:

val status = {
  val httpPackage = http(Status(screenName).timeline)
  val json1 = httpPackage
  json1
} 

现在我被困在如何解析twitter json响应

我试过使用JsonParser:

val status1 = JsonParser.parse(status) 

但得到了这个错误:

<console>:38: error: overloaded method value parse with alternatives: 
(s: java.io.Reader)net.liftweb.json.JsonAST.JValue<and> 
(s: String)net.liftweb.json.JsonAST.JValue 
cannot be applied to (http.HttpPackage[List[dispatch.json.JsObject]]) 
   val status1 = JsonParser.parse(status1) 

我不确定并且无法弄清楚下一步要做什么来迭代数据,提取它并将其呈现到我的网页。

2 个答案:

答案 0 :(得分:6)

这是使用Dispatch HTTP和Lift-JSON的另一种方法。此示例从google获取JSON文档,从中解析所有“标题”并打印它们。

import dispatch._
import net.liftweb.json.JsonParser
import net.liftweb.json.JsonAST._

object App extends Application {
  val http = new Http
  val req = :/("www.google.com") / "base" / "feeds" / "snippets" <<? Map("bq" -> "scala", "alt" -> "json")
  val json = http(req >- JsonParser.parse)

  val titles = for {
    JField("title", title) <- json
    JField("$t", JString(name)) <- title
  } yield name

  titles.foreach(println)
}

答案 1 :(得分:5)

您收到的错误让您知道status的类型既不是字符串,也不是java.io.Reader。相反,你拥有的是已经解析过的JSON响应列表,因为Dispatch已经完成了将响应解析为JSON响应的所有艰苦工作。 Dispatch有一个非常紧凑的语法,当你习惯它时很好,但它最初可能非常迟钝,特别是当你第一次接近Scala时。通常情况下,当您第一次学习查看正在发生的事情时,您会发现必须深入了解库的源代码。例如,如果您查看dispatch-twitter源代码,您可以看到timeline method实际上对响应执行了JSON提取:

def timeline = this ># (list ! obj)

此方法定义的是Dispatch Handler,它将Response对象转换为JsonResponse对象,然后将响应解析为JSON对象列表。在一行中有相当多的进展。您可以在http + json Dispatch模块的JsHttp.scala文件中看到操作数>#的定义。 Dispatch定义了许多处理程序,它们在幕后进行转换为不同类型的数据,然后您可以将这些数据传递给阻止使用。查看一些处理程序的StdOut WalkthroughCommon Tasks页面,但您需要深入了解各种模块源代码或Scaladoc以了解其他内容。

所有这一切都是很长的路要走到你想要的东西,我相信基本上就是这样:

val statuses = http(Status(screenName).timeline)
statuses.map(Status.text).foreach(println _)

您可以以任何您想要的方式将其推送到您的网页,而不是执行println。查看Status object中的一些预先构建的提取器,以便从状态响应中提取信息。