1

使用 Scala 2.8 和 Lift 2.2。

我正在调用 Github API 并为用户请求存储库。当用户的 repos 少于 30 个时,会进行一次调用,并且不需要连接 JValue。但是,当用户有超过 30 个 repos 时,会进行多次调用。我想从这些调用中连接这些结果,然后将它们“展平”。即 JValue 上的“存储库”名称应返回所有存储库,而不仅仅是前 30 个。

下面的代码返回以下内容: Array(List(JObject(List(JField(repositories,JArray(...JObject(List(JField(repositories,JArray...))))))))

我想要的是: Array(List(JObject(List(JField(repositories,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))
}
4

1 回答 1

4

函数“合并”应该像你描述的那样合并那些 JSON:

parse(line1) merge parse(line2)

或更笼统地说:

List(json1, json2, ...).foldLeft(JNothing: JValue)(_ merge _)
于 2011-02-18T07:43:12.080 回答