как извлечь из dispatch.json.JsObject - PullRequest
5 голосов
/ 22 сентября 2010

Что мне нужно сделать, чтобы извлечь значение для friends_count. я заметил, что screen_name уже определены в объекте Status и классе case. Требуется ли расширение Js или JsObject другим

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

, а затем шаблон сопоставляет его с каждым объектом json в списке объектов JsObject, как показано ниже. Символы сбивают с толку:

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)

}

1 Ответ

6 голосов
/ 26 сентября 2010

Обычно символы Scala можно рассматривать как уникальный идентификатор, который всегда будет одинаковым. Каждый символ, который лексикографически идентичен, относится к одному и тому же пространству памяти. С точки зрения Скалы, в них нет ничего особенного.

Однако Dispatch-Json выводит символы, превращая их в экстракторы свойств JSON. Чтобы увидеть код, отвечающий за сутенерство, проверьте класс SymOp и остальную часть кода JsonExtractor.scala.

Давайте напишем некоторый код, который решает проблему, которую вы смотрите, а затем проанализируете, что происходит:

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)

Первое, что мы делаем, - это расширяем черту UserProps в модуле Dispatch-Twitter, чтобы дать ему экстрактор friends_count, а затем определяем объект ExtUser, который мы можем использовать для получения доступа к этому экстрактору. Поскольку ExtUserProps расширяет UserProps, который также расширяет Js, мы получаем метод sym_add_operators в области видимости, который превращает наш символ 'friends_count в класс case SymOp. Затем мы вызываем метод ! для этого SymOp, который затем передаем Extractor num, который создает Extractor, который ищет свойство friends_count для объекта JSON а затем анализирует его как число, прежде чем вернуться. Для такого небольшого фрагмента кода происходит довольно много.

Следующая часть программы - это просто для понимания, которое вызывает для пользователя временную шкалу Twitter и разбирает ее на JsObjects, которые представляют каждый элемент статуса, а затем мы применяем экстрактор Status.text для извлечения сообщения о состоянии. , Затем мы делаем то же самое, чтобы вытащить пользователя. Затем мы извлекаем screen_name и friend_count из пользовательского JsObject и, наконец, возвращаем Tuple3 со всеми свойствами, которые мы искали. Затем у нас остаётся список [Tuple3 [String, String, BigDecimal]], который можно затем перебрать, чтобы распечатать или сделать с ним что угодно.

Надеюсь, это прояснит некоторые вещи. Библиотека Dispatch очень выразительна, но она может быть немного сложной, чтобы обернуть вашу голову, поскольку она использует множество трюков Scala, которые кто-то, только изучающий Scala, не получит сразу. Но продолжайте подключаться и играть, а также смотреть на тесты и исходный код, и вы увидите, как создавать мощные DSL с использованием Scala.

...