Как использовать dispatch.json в проекте лифта

Я запутался в том, как объединить библиотеку json в диспетчерской и поднять, чтобы разобрать мой ответ json.

Я, видимо, новичок в скале.

Я написал этот код:

val status = {
  val httpPackage = http(Status(screenName).timeline)
  val json1 = httpPackage
  json1
} 

Теперь я застрял на том, как разобрать ответ Twitter JSON

Я пытался использовать JsonParser:

val status1 = JsonParser.parse(status) 

но получил эту ошибку:

<console>:38: error: overloaded method value parse with alternatives: 
(s: java.io.Reader)net.liftweb.json.JsonAST.JValue<and> 
(s: String)net.liftweb.json.JsonAST.JValue 
cannot be applied to (http.HttpPackage[List[dispatch.json.JsObject]]) 
   val status1 = JsonParser.parse(status1) 

Я не уверен и не могу понять, что делать дальше, чтобы перебрать данные, извлечь их и отобразить на моей веб-странице.

2 ответа

Решение

Ошибка, которую вы получаете, дает вам знать, что тип status не является ни строкой, ни java.io.Reader, Вместо этого у вас есть список уже проанализированных ответов JSON, так как Dispatch уже выполнил всю тяжелую работу по синтаксическому анализу ответа в ответ JSON. Диспетчер имеет очень компактный синтаксис, который хорош, когда вы к нему привыкли, но изначально он может быть очень тупым, особенно когда вы впервые приближаетесь к Scala. Часто вы обнаружите, что вам нужно погрузиться в исходный код библиотеки, когда вы впервые изучаете, чтобы увидеть, что происходит. Например, если вы посмотрите на исходный код dispatch-twitter, вы увидите, что timeline Метод фактически выполняет извлечение JSON для ответа:

def timeline = this ># (list ! obj)

Этот метод определяет обработчик диспетчеризации, который преобразует объект Response в объект JsonResponse, а затем анализирует ответ в список объектов JSON. Это довольно много происходит в одной строке. Вы можете увидеть определение операнда ># в файле JsHttp.scala в модуле отправки http + json. Dispatch определяет множество обработчиков, которые выполняют закулисное преобразование в различные типы данных, которые затем можно передать в блок для работы. Посмотрите страницы StdOut Walkthrough и Common Tasks для некоторых из обработчиков, но вам нужно погрузиться в исходный код различных модулей или Scaladoc, чтобы увидеть, что там еще есть.

Все это долгий путь к тому, что вы хотите, что я считаю, по сути, это:

val statuses = http(Status(screenName).timeline)
statuses.map(Status.text).foreach(println _)

Только вместо того, чтобы делать printlnВы можете отправить его на свою веб-страницу любым удобным для вас способом. Изучите объект Status для некоторых предварительно собранных экстракторов, чтобы извлечь информацию из ответа о состоянии.

Вот еще один способ использовать Dispatch HTTP с Lift-JSON. Этот пример извлекает документ JSON из Google, анализирует все "заголовки" и печатает их.

import dispatch._
import net.liftweb.json.JsonParser
import net.liftweb.json.JsonAST._

object App extends Application {
  val http = new Http
  val req = :/("www.google.com") / "base" / "feeds" / "snippets" <<? Map("bq" -> "scala", "alt" -> "json")
  val json = http(req >- JsonParser.parse)

  val titles = for {
    JField("title", title) <- json
    JField("$t", JString(name)) <- title
  } yield name

  titles.foreach(println)
}
Другие вопросы по тегам