5

我需要做什么来提取friends_count的值。我注意到 screen_name 已经在 Status 对象和案例类中定义。仍然需要扩展 Js 或 JsObject 不同

object TweetDetails extends Js { val friends_count = 'friends_count ? num }

然后将其与 JsObjects 列表中的每个 json 对象进行模式匹配,如下所示。这些符号令人困惑:

scala> val friends_count = 'friends_count ! num  // I wish SO understood Scala's symbols
val twtJsonList = http(Status("username").timeline)
twtJsonList foreach {
      js =>
        val Status.user.screen_name(screen_name) = js
        val Status.text(text) = js
        val friends_counts(friends_count) = js //i cannot figure out how to extract this
        println(friends_count)
        println(screen_name)
        println(text)

}

4

1 回答 1

6

通常,Scala 符号可以被认为是一个始终相同的唯一标识符。每个在词法上相同的符号都指的是完全相同的内存空间。从 Scala 的角度来看,它们没有什么特别之处。

但是,Dispatch-Json 会提取符号,使其成为 JSON 属性提取器。要查看负责拉皮条的代码,请查看SymOp 类和 JsonExtractor.scala 代码的其余部分。

让我们编写一些代码来解决您正在查看的问题,然后分析发生了什么:

trait ExtUserProps extends UserProps with Js {
  val friends_count = 'friends_count ! num 
}
object ExtUser extends ExtUserProps with Js

val good_stuff = for {
  item <- http(Status("username").timeline)
  msg = Status.text(item)
  user = Status.user(item)
  screen_name = ExtUser.screen_name(user)
  friend_count = ExtUser.friends_count(user)
} yield (screen_name, msg, friend_count)

我们要做的第一件事是扩展 Dispatch-Twitter 模块中的 UserProps 特征,为其提供一个friends_count提取器,然后定义一个ExtUser我们可以用来访问该提取器的对象。因为 ExtUserProps 扩展了 UserProps,而 UserProps 也扩展了 Js,所以我们得到了sym_add_operators作用域中的方法,它将我们的符号'friends_count转换为 SymOp 案例类。!然后我们在 SymOp 上调用该方法,然后将 Extractor 传递给该方法,该方法num创建一个 Extractor,它在 JSON 对象上查找属性“friends_count”,然后在返回之前将其解析为数字。对于这么少的代码,有很多事情要做。

程序的下一部分只是一个理解,它为用户调用 Twitter 时间线并将其解析为代表每个状态项的 JsObjects,我们应用Status.text提取器提取状态消息。然后我们做同样的事情来拉出用户。然后,我们将 screen_name 和friend_count 从用户 JsObject 中提取出来,最后我们返回一个 Tuple3,其中包含我们正在寻找的所有属性。然后我们剩下一个 List[Tuple3[String,String,BigDecimal]] ,然后您可以对其进行迭代以打印出来或做任何事情。

我希望这能澄清一些事情。Dispatch 库非常具有表现力,但可能有点难以理解,因为它使用了许多 Scala 技巧,而刚学习 Scala 的人不会马上掌握。但是请继续使用和使用,以及查看测试和源代码,您将了解如何使用 Scala 创建强大的 DSL。

于 2010-09-26T12:54:12.773 回答