Как использовать dispatch.json в проекте лифта - PullRequest
4 голосов
/ 17 сентября 2010

я запутался в том, как объединить библиотеку 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 ]

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

Вот еще один способ использовать 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)
}
5 голосов
/ 17 сентября 2010

Ошибка, которую вы получаете, дает вам понять, что тип status не является ни String, ни 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, чтобы узнать, что там еще есть. 1016 *

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

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

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

...