2010-09-22 43 views
5

Tôi cần làm gì để trích xuất giá trị cho friends_count. tôi nhận thấy rằng screen_name đã được xác định trong đối tượng Trạng thái và trường hợp lớp. Bạn vẫn cần phải mở rộng Js hoặc JsObject khác nhaucách trích xuất từ ​​dispatch.json.JsObject

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

và sau đó mẫu khớp với từng đối tượng json trong danh sách các JsObject như được trình bày bên dưới. Các biểu tượng là khó hiểu:

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

Câu trả lời phụ thuộc * hoàn toàn * trên thư viện/API bạn đang sử dụng, nhưng bạn chưa chỉ định điều này. –

+0

tôi đang sử dụng thư viện HTTP công văn của scala .. –

Trả lời

6

Thông thường, biểu tượng Scala có thể được coi như là một định danh duy nhất mà sẽ luôn luôn giống nhau. Mỗi biểu tượng giống hệt nhau về mặt đồ họa đều đề cập đến cùng một không gian bộ nhớ chính xác. Không có gì khác đặc biệt về họ từ quan điểm của Scala.

Tuy nhiên, Dispatch-Json pimps ra các biểu tượng khiến chúng trở thành trình giải nén thuộc tính JSON. Để xem mã chịu trách nhiệm cho việc bẻ cong, hãy xem SymOp class và phần còn lại của mã JsonExtractor.scala.

Hãy viết một số mã mà giải quyết vấn đề bạn đang xem xét và sau đó phân tích những gì đang xảy ra:

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) 

Việc đầu tiên mà chúng tôi đang làm là mở rộng các đặc điểm UserProps trong module văn-Twitter để cung cấp cho nó một bộ giải nén friends_count và sau đó xác định một đối tượng ExtUser mà chúng ta có thể sử dụng để truy cập vào bộ giải nén đó. Bởi vì ExtUserProps mở rộng UserProps, cũng mở rộng Js, chúng ta lấy phương thức sym_add_operators trong phạm vi biến biểu tượng 'friends_count thành một lớp vỏ của SymOp. Sau đó chúng ta gọi phương thức trên SymOp mà sau đó chúng ta chuyển Extractor num thành, mà tạo ra một Trình trích xuất tìm kiếm thuộc tính "friends_count" trên một đối tượng JSON và sau đó phân tích nó như một số trước khi trở về. Khá một chút xảy ra ở đó với một chút mã như vậy.

Phần tiếp theo của chương trình chỉ là một sự hiểu biết gọi ra dòng thời gian Twitter cho người dùng và phân tích nó thành JsObjects đại diện cho từng mục trạng thái, chúng tôi áp dụng trình trích xuất Status.text để kéo thông báo trạng thái. Sau đó, chúng tôi làm như vậy để kéo người dùng ra. Sau đó, chúng ta kéo screen_name và friend_count ra khỏi người dùng JsObject và cuối cùng chúng tôi đưa ra một Tuple3 trở lại với tất cả các thuộc tính mà chúng tôi đang tìm kiếm. Sau đó, chúng tôi đã để lại một Danh sách [Tuple3 [String, String, BigDecimal]] mà sau đó bạn có thể lặp lại để in ra hoặc làm bất cứ điều gì.

Tôi hy vọng sẽ xóa một số thứ. Thư viện Dispatch rất biểu cảm nhưng có thể hơi khó khăn để quấn đầu của bạn xung quanh vì nó sử dụng rất nhiều thủ thuật Scala mà ai đó chỉ học Scala sẽ không nhận được ngay lập tức. Nhưng tiếp tục cắm và chơi với, cũng như xem xét các bài kiểm tra và mã nguồn, và bạn sẽ thấy cách tạo ra DSL mạnh mẽ bằng cách sử dụng Scala.