2010-09-22 23 views
5

Que dois-je faire pour extraire la valeur de friends_count. J'ai remarqué que screen_name est déjà défini dans l'objet Status et la classe de cas. Ne nécessitent encore étend Js ou JSObject différentscomment extraire de dispatch.json.JsObject

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

puis match de modèle contre chaque objet JSON dans la liste des JSObjects représentée ci-dessous. Les symboles sont confus:

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

La réponse dépend * entièrement * de la bibliothèque/API que vous utilisez, mais vous ne l'avez pas spécifiée. –

+0

J'utilise la bibliothèque HTTP de répartition de la scala. –

Répondre

6

Normalement, les symboles Scala peut être considéré comme un identifiant unique qui sera toujours le même. Chaque symbole qui est lexi-graphiquement identique se réfère exactement au même espace mémoire. Il n'y a rien d'autre de spécial à leur sujet du point de vue de Scala.

Toutefois, Dispatch-Json pimpe les symboles qui en font des extracteurs de propriétés JSON. Pour voir le code qui est responsable du proxénétisme, consultez le SymOp class et le reste du code JsonExtractor.scala.

Écrivons un code qui permet de résoudre le problème que vous êtes à la recherche puis d'analyser ce qui se passe:

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) 

La première chose que nous faisons est l'extension du trait de UserProps dans le module Dispatch-Twitter à donnez-lui un extracteur friends_count puis définissez un objet ExtUser que nous pouvons utiliser pour accéder à cet extracteur. Parce que ExtUserProps étend UserProps, qui étend également Js, nous obtenons la méthode sym_add_operators dans la portée qui transforme notre symbole 'friends_count en une classe de cas SymOp. Nous appelons ensuite la méthode sur ce SymOp auquel nous transmettons ensuite l'extracteur num à, ce qui crée un extracteur qui recherche une propriété "friends_count" sur un objet JSON, puis l'analyse en tant que nombre avant de retourner. Beaucoup de choses là-bas pour un si petit bout de code. La partie suivante du programme est juste une compréhension forcée qui appelle le calendrier Twitter pour un utilisateur et l'analyse en JsObjects qui représentent chaque élément d'état, nous appliquons l'extracteur Status.text pour extraire le message d'état. Ensuite, nous faisons de même pour sortir l'utilisateur. Nous tirons ensuite le screen_name et le friend_count de l'utilisateur JsObject et finalement nous ramenons un Tuple3 avec toutes les propriétés que nous recherchions. Il nous reste alors une liste [Tuple3 [String, String, BigDecimal]] que vous pouvez ensuite parcourir pour imprimer ou faire n'importe quoi avec.

J'espère que cela efface certaines choses. La librairie Dispatch est très expressive mais peut être un peu difficile à comprendre car elle utilise beaucoup de trucs Scala que quelqu'un qui apprend juste Scala n'obtiendra pas tout de suite. Mais continuez à vous brancher et à jouer avec, ainsi que regarder les tests et le code source, et vous verrez comment créer des DSL puissants en utilisant Scala.