我很困惑如何在调度和提升中组合json库来解析我的json响应.
我显然是斯卡拉新手.
我写了这段代码:
val status = {
val httpPackage = http(Status(screenName).timeline)
val json1 = httpPackage
json1
}
Run Code Online (Sandbox Code Playgroud)
现在我被困在如何解析twitter json响应
我试过使用JsonParser:
val status1 = JsonParser.parse(status)
Run Code Online (Sandbox Code Playgroud)
但得到了这个错误:
<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)
Run Code Online (Sandbox Code Playgroud)
我不确定,无法弄清楚接下来要做什么,以便迭代数据,提取它并将其呈现到我的网页.
这是使用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)
}
Run Code Online (Sandbox Code Playgroud)
您收到的错误是让您知道类型status既不是String也不是java.io.Reader.相反,你拥有的是已经解析过的JSON响应列表,因为Dispatch已经完成了将响应解析为JSON响应的所有艰苦工作.Dispatch有一个非常紧凑的语法,当你习惯它时很好,但它最初可能非常迟钝,尤其是当你第一次接近Scala时.通常情况下,当您第一次学习查看正在发生的事情时,您会发现必须深入了解库的源代码.例如,如果您查看dispatch-twitter源代码,您可以看到该timeline方法实际上对响应执行JSON提取:
def timeline = this ># (list ! obj)
Run Code Online (Sandbox Code Playgroud)
此方法定义的是Dispatch Handler,它将Response对象转换为JsonResponse对象,然后将响应解析为JSON对象列表.在一行中有相当多的进展.您可以在http + json Dispatch模块>#的JsHttp.scala文件中看到操作数的定义.Dispatch定义了许多处理程序,它们在幕后进行转换为不同类型的数据,然后您可以将这些数据传递给阻止使用.查看一些处理程序的StdOut演练和常见任务页面,但是您需要深入了解各种模块源代码或Scaladoc以查看其他内容.
所有这一切都是很长的路要走到你想要的东西,我相信这基本上是这样的:
val statuses = http(Status(screenName).timeline)
statuses.map(Status.text).foreach(println _)
Run Code Online (Sandbox Code Playgroud)
只有不用做println,你可以以任何你想要的方式将它推送到你的网页.查看一些各种预构建的提取器的Status对象,以从状态响应中提取信息.