Как использовать 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)
}