Trabalhando com JValues concatenados em liftjson
-
15-11-2019 - |
Pergunta
Usando Scala 2.8 e Lift 2.2.
Estou ligando para a API do Github e solicitando repositórios para um usuário.Quando o usuário possui menos de 30 repositórios uma chamada é feita e não há necessidade de concatenar JValues.Porém, quando o usuário possui mais de 30 repositórios, múltiplas chamadas são feitas.Gostaria de concatenar esses resultados dessas chamadas e depois “nivelá-los”.ou sejaO nome dos "repositórios" em um JValue deve retornar todos os repositórios, não apenas os primeiros 30.
O código abaixo retorna o seguinte:Array(List(JObject(List(JField(repositórios,JArray(...JObject(List(JField(repositórios,JArray...)))))))))
O que eu quero é:Array(List(JObject(List(JField(repositories,JArray(....))))) onde o nome dos repositórios aponta para todos dos repositórios.
Eu lutei com isso um pouco e não consigo entender.
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))
}
Solução
A função 'mesclagem' deve mesclar esses JSONs como você descreveu:
parse(line1) merge parse(line2)
Ou mais genericamente:
List(json1, json2, ...).foldLeft(JNothing: JValue)(_ merge _)