2010-09-22 21 views
5

Co muszę zrobić, aby wyodrębnić wartość dla friends_count. zauważyłem, że screen_name są już zdefiniowane w obiekcie Status i klasie sprawy. Czy nadal wymagają rozciąga JS lub JSObject różnychJak wyodrębnić z dispatch.json.JsObject

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

a następnie dopasowania do wzorca go przed każdym obiekcie json w wykazie JsObjects reprezentowane poniżej. Symbole są niejasne:

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

Odpowiedź zależy * całkowicie * od biblioteki/interfejsu API, którego używasz, ale nie podano tego. –

+0

Korzystam z biblioteki HTTP wysyłek scala –

Odpowiedz

6

Normalnie symbole Scala mogą być traktowane jako unikatowy identyfikator, który zawsze będzie taka sama. Każdy symbol, który jest identyczny w sensie lexi-graficznym, odnosi się do dokładnie tej samej przestrzeni pamięci. Z punktu widzenia Scali nie ma nic wyjątkowego.

Jednakże, Dispatch-Json wykrywa symbole, dzięki którym są one ekstraktorami właściwości JSON. Aby zobaczyć kod odpowiedzialny za sutkowanie, sprawdź kod SymOp class i resztę kodu JsonExtractor.scala.

Załóżmy napisać kod, który rozwiązuje ten problem patrzysz, a następnie analizować, co się dzieje:

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) 

Pierwszą rzeczą, którą robimy rozszerza cechę UserProps w module Dispatch-Twitterze daj mu ekstraktor friends_count, a następnie definiując obiekt, którego możemy użyć, aby uzyskać dostęp do tego ekstraktora. Ponieważ ExtUserProps rozszerza UserProps, co również rozszerza Js, otrzymujemy metodę sym_add_operators w zakresie, który przekształca nasz symbol 'friends_count w klasę przypadków SymOp. Następnie wywołujemy metodę na tym SymOp, do którego następnie przekazujemy Extractor num do, który tworzy ekstraktor, który szuka właściwości "friends_count" na obiekcie JSON, a następnie analizuje go jako liczbę przed powrotem. Trochę się tam dzieje z tak małym kawałkiem kodu.

Następna część programu jest po prostu dla zrozumienia, która wywołuje na osi czasu Twittera użytkownika i przetwarza go na JsObjects, które reprezentują każdy element statusu, stosujemy ekstraktor Status.text do wyciągnięcia komunikatu statusu. Następnie robimy to samo, aby wyciągnąć użytkownika. Następnie usuwamy parametr screen_name i friend_count z użytkownika JsObject, a na końcu otrzymujemy Tuple3 z wszystkimi właściwościami, których szukaliśmy. Zostaje nam wtedy lista [Tuple3 [String, String, BigDecimal]], którą możesz następnie powtórzyć, aby wydrukować lub zrobić cokolwiek z.

Mam nadzieję, że niektóre rzeczy się poprawią. Biblioteka Dispatch jest bardzo ekspresyjna, ale może być trochę trudna do owinięcia głowy, ponieważ używa wielu sztuczek Scala, których ktoś dopiero uczący się Scali nie otrzyma od razu. Ale nie przestawaj kręcić i grać, a także przyglądać się testom i kodowi źródłowemu, a zobaczysz, jak tworzyć wydajne DSL-y używając Scali.

Powiązane problemy