4

ディスパッチとリフトでjsonライブラリを組み合わせて、json応答を解析する方法について混乱しています。

私はどうやらscala初心者です。

私はこのコードを書きました:

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

今、私はツイッターの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) 

データを反復処理し、抽出してWebページにレンダリングするために、次に何をすべきかわからないため、理解できません。

4

2 に答える 2

6

Lift-JSONでDispatchHTTPを使用する別の方法を次に示します。この例では、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文字列でも。でもないことを通知していますjava.io.Reader。代わりに、Dispatchが応答をJSON応答に解析する際のすべてのハードワークをすでに実行しているため、既に解析されたJSON応答のリストがあります。Dispatchの構文は非常にコンパクトで、慣れている場合は便利ですが、特に最初にScalaにアプローチする場合は、最初は非常に鈍感になる可能性があります。多くの場合、何が起こっているのかを最初に学習するときに、ライブラリのソースコードに飛び込む必要があることに気付くでしょう。たとえば、dispatch-twitterのソースコードを調べると、timelineメソッドが実際に応答に対してJSON抽出を実行していることがわかります。

def timeline = this ># (list ! obj)

このメソッドが定義しているのは、ResponseオブジェクトをJsonResponseオブジェクトに変換し、応答をJSONオブジェクトのリストに解析するDispatchHandlerです。それは一行でかなり起こっています。オペランドの定義は、http +jsonDispatchモジュール>#JsHttp.scalaファイルで確認できます。Dispatchは、バックグラウンドでさまざまなタイプのデータに変換を行う多くのハンドラーを定義します。これらのデータをブロックに渡して操作できます。いくつかのハンドラーについては、 StdOutウォークスルー共通タスクのページを確認してください。ただし、他に何があるかを確認するには、さまざまなモジュールのソースコードまたはScaladocに飛び込む必要があります。

これはすべて、あなたが望むものに到達するための長い道のりです。私はそれが本質的にこれであると信じています。

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

を実行する代わりにprintln、好きな方法でWebページにプッシュできます。ステータス応答から情報を引き出すために、さまざまなビルド済みエクストラクタのStatusオブジェクトを確認してください。

于 2010-09-17T03:23:23.557 に答える