如何从dispatch.json.JsObject中提取

时间:2010-09-22 02:40:11

标签: json scala twitter lift scala-dispatch

我需要做些什么才能为friends_count提取值。我注意到screen_name已经在Status对象和case类中定义。仍然需要扩展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)

}

1 个答案:

答案 0 :(得分:6)

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

但是,Dispatch-Json将符号变成了符号,使它们成为JSON属性提取器。要查看负责拉皮条的代码,请查看SymOp class以及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,它也扩展了Js,我们在范围内得到方法sym_add_operators,将符号'friends_count转换为SymOp案例类。然后我们在SymOp上调用!方法,然后我们将Extractor num传递给它,这会创建一个Extractor,在JSON对象上查找属性“friends_count”,然后将其解析为数字返回。对于如此少量的代码,相当多的进展。

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

我希望清除一些事情。 Dispatch库非常具有表现力,但是它可能有点难以理解,因为它使用了很多Scala技巧,有些人只是学习Scala不会马上得到它。但是继续插入和玩游戏,以及查看测试和源代码,你会看到如何使用Scala创建强大的DSL。