Работа с сцепленными JValues ​​в liftjson - PullRequest
1 голос
/ 18 февраля 2011

Использование Scala 2.8 и Lift 2.2.

Я звоню в Github API и запрашиваю репозитории для пользователя. Когда у пользователя менее 30 репо, выполняется один вызов, и нет необходимости объединять JValues. Однако, когда у пользователя более 30 репо, выполняется несколько звонков. Я хотел бы объединить эти результаты этих звонков, а затем «сплющить» их. то есть имя «хранилища» в JValue должно возвращать все хранилища, а не только первые 30.

Приведенный ниже код возвращает следующее: Array (List (JObject (List (JField (репозитории, JArray (... JObject), List (JField (репозитории, JArray ...))))))))

То, что я хочу, это: Массив (List (JObject (List (JField (репозитории, JArray (....))))), где имя репозитория указывает на все репозиториев.

Я немного боролся с этим и, похоже, не понимаю.

import java.io._
import net.liftweb.json.JsonAST._
import net.liftweb.json.JsonParser._
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.{ DefaultHttpClient }

object Github extends Application {
  implicit val formats = net.liftweb.json.DefaultFormats

  val client = new DefaultHttpClient()

  var repos = JArray(List[JValue]())

  //Pick on mojombo since he has 30+ repos requires to calls to API
  var method = new HttpGet("http://github.com/api/v2/json/repos/show/" + "mojombo" +   "?page=1")

  var response = client.execute(method)

  var instream = response.getEntity.getContent();
  var reader = new BufferedReader(new InputStreamReader(instream))
  var line1 = reader.readLine

  method = new HttpGet("http://github.com/api/v2/json/repos/show/" + "mojombo" + "?page=2")

  response = client.execute(method)

  instream = response.getEntity.getContent();
  reader = new BufferedReader(new InputStreamReader(instream))
  val line2 = reader.readLine

  println(parse(line1) ++ parse(line2))
}

1 Ответ

4 голосов
/ 18 февраля 2011

Функция 'merge' должна объединить те JSON, которые вы описали:

parse(line1) merge parse(line2)

Или более обобщенно:

List(json1, json2, ...).foldLeft(JNothing: JValue)(_ merge _)
...