2010-09-22 18 views
5

¿Qué debo hacer para extraer el valor de friends_count. noté que screen_name ya está definido en el objeto de estado y la clase de caso. No todavía requieren que se extiende Js o JSObject diferentecómo extraer de dispatch.json.JsObject

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

y luego el ajuste de patrones contra cada objeto JSON en la lista de JsObjects como se representa a continuación. Los símbolos son confusas:

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 respuesta depende * completamente * de la biblioteca/API que está utilizando, pero no ha especificado esto. –

+0

estoy usando la biblioteca HTTP de envío de scala .. –

Respuesta

6

Normalmente, se puede pensar símbolos Scala de como un identificador único que siempre será el mismo. Cada símbolo que es lexi-gráficamente idéntico se refiere al mismo espacio de memoria. No hay nada más especial sobre ellos desde el punto de vista de Scala.

Sin embargo, Dispatch-Json prohíbe símbolos que los convierten en extractores de propiedades JSON. Para ver el código que es responsable del proxenetismo, consulte SymOp class y el resto del código JsonExtractor.scala.

Vamos a escribir algo de código que resuelve el problema que usted está mirando y luego analizar lo que está pasando:

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) 

Lo primero que estamos haciendo es extender el rasgo userprops en el módulo de Despacho-Twitter para darle un extractor friends_count y luego definir un objeto ExtUser que podemos usar para obtener acceso a ese extractor. Debido a que ExtUserProps extiende UserProps, que también extiende Js, obtenemos el método sym_add_operators en el alcance que convierte nuestro símbolo 'friends_count en una clase de caso SymOp. Luego llamamos al método en ese SymOp al que luego pasamos el Extractor num, que crea un Extractor que busca una propiedad "cuenta_amigos" en un objeto JSON y luego lo analiza como un número antes de regresar. Bastante un poco allí para un código tan pequeño.

La siguiente parte del programa es solo una comprensión que llama a la línea de tiempo de Twitter para un usuario y la analiza en JsObjects que representan cada elemento de estado, les aplicamos el extractor Status.text para extraer el mensaje de estado. Luego hacemos lo mismo para sacar al usuario. A continuación, extraemos el nombre de pantalla y el número de amigo del usuario JsObject y, finalmente, cedemos un Tuple3 con todas las propiedades que estábamos buscando. Luego nos queda una Lista [Tuple3 [String, String, BigDecimal]] que luego puede repetir para imprimir o hacer lo que quiera con.

Espero que aclare algunas cosas. La biblioteca Dispatch es muy expresiva, pero puede ser un poco difícil de entender ya que utiliza muchos trucos Scala que alguien que recién está aprendiendo Scala no obtendrá de inmediato. Pero sigue conectando y jugando, además de ver las pruebas y el código fuente, y verás cómo crear poderosas DSL usando Scala.