我需要做些什么才能为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)
}
答案 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。