2010-09-22 8 views
5

Cosa devo fare per estrarre il valore per friends_count. ho notato che screen_name è già definito nell'oggetto Status e nella classe case. Non ancora richiedono di estende Js o JSObject differentecome estrarre da dispatch.json.JsObject

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

e poi reticolo partita contro ogni oggetto json nell'elenco delle JSObject come rappresentato di seguito. I simboli sono confuse:

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 risposta dipende * interamente * dalla libreria/API che stai utilizzando, ma non l'hai specificato. –

+0

sto usando la libreria HTTP di dispatch di scala .. –

risposta

6

Normalmente, simboli Scala può essere pensato come un identificatore univoco che sarà sempre lo stesso. Ogni simbolo che è identicamente lexi-graficamente si riferisce allo stesso identico spazio di memoria. Non c'è nient'altro di speciale in loro dal punto di vista di Scala.

Tuttavia, Dispatch-Json estrae i simboli rendendoli estrattori di proprietà JSON. Per vedere il codice che è responsabile del pimping, controlla lo SymOp class e il resto del codice JsonExtractor.scala.

Scriviamo po 'di codice che risolve il problema che si sta guardando e poi analizzare quello che sta succedendo:

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 prima cosa che stiamo facendo sta estendendo il tratto UserProps nel modulo Dispatch Twitter per dargli un estrattore friends_count e quindi definire un oggetto ExtUser che possiamo usare per ottenere l'accesso a tale estrattore. Poiché ExtUserProps estende UserProps, che estende anche Js, otteniamo il metodo sym_add_operators in ambito che trasforma il nostro simbolo 'friends_count in una classe di case SymOp. Chiamiamo quindi il metodo su SymOp che passiamo a Extractor num, che crea un Extractor che cerca una proprietà "account_amici" su un oggetto JSON e poi lo analizza come numero prima di tornare. Un po 'andando avanti per un po' di codice.

La parte successiva del programma è solo un per-comprensione che chiama fuori per la timeline di Twitter per un utente e lo analizza in JSObject che rappresentano ogni elemento dello stato, li applichiamo l'estrattore Status.text per tirare fuori il messaggio di stato. Quindi facciamo lo stesso per estrarre l'utente. Quindi estraiamo screen_name e friend_count dall'utente JsObject e alla fine restituiamo un Tuple3 con tutte le proprietà che stavamo cercando. Rimaniamo quindi con un elenco [Tuple3 [String, String, BigDecimal]] che è possibile quindi iterare per stampare o fare qualsiasi cosa con.

Spero che chiarisca alcune cose. La libreria di Dispatch è molto espressiva, ma può essere un po 'difficile da comprendere, poiché utilizza un sacco di trucchi Scala che qualcuno che ha appena imparato Scala non otterrà subito. Ma continua a collegare e giocare, oltre a guardare i test e il codice sorgente, e vedrai come creare potenti DSL usando Scala.