4

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

我显然是一个scala新手。

我写了这段代码:

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) 

我不确定也无法弄清楚接下来要做什么来遍历数据、提取数据并将其呈现到我的网页上。

4

2 回答 2

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)
}
于 2010-09-17T12:39:10.833 回答
5

您返回的错误是让您知道类型status既不是 String 也不是java.io.Reader. 相反,您拥有的是一个已经解析的 JSON 响应列表,因为 Dispatch 已经完成了将响应解析为 JSON 响应的所有艰苦工作。Dispatch 有一个非常紧凑的语法,当你习惯它时它会很好,但一开始它可能会非常迟钝,尤其是当你第一次接触 Scala 时。很多时候,当您第一次学习查看发生了什么时,您会发现必须深入研究库的源代码。例如,如果您查看 dispatch-twitter 源代码,您可以看到该timeline方法实际上对响应执行 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您可以以任何您想要的方式将其推送到您的网页,而不是执行 a 。查看状态对象中的一些预构建提取器,以从状态响应中提取信息。

于 2010-09-17T03:23:23.557 回答