json - 在 Scala 中解析对 jsonarray 的请求
问题描述
请求https://api.github.com/users返回用户列表。如何在 Scala 中将其解析为 json 对象数组,以便访问对象的字段,例如登录名、id、...
解决方案
您可以使用sttp-client进行 http 调用并circe将 json 解码为 scala 对象。
val SttpVersion = "1.1.12"
val circeVersion = "0.9.3"
libraryDependencies ++= Seq(
"com.softwaremill.sttp" %% "core" % SttpVersion,
"com.softwaremill.sttp" %% "async-http-client-backend-future" % SttpVersion,
"io.circe" %% "circe-core" % circeVersion,
"io.circe" %% "circe-generic" % circeVersion,
"io.circe" %% "circe-parser" % circeVersion
)
例子,
object GetExample {
import scala.concurrent.ExecutionContext.Implicits.global
import com.softwaremill.sttp._
import com.softwaremill.sttp.asynchttpclient.future._
import io.circe._
import io.circe.parser._
implicit val backend = AsyncHttpClientFutureBackend()
def main(args: Array[String]): Unit = {
val usersResponse: Future[Response[String]] = sttp.get(uri"""https://api.github.com/users""").send()
val users = usersResponse.map {
case Response(Right(r), _, _, _, _) => parse(r).map { json =>
val users: Option[Vector[Json]] = json.asArray.map(arr => arr.flatMap(_.\\("login")))
users.getOrElse(Vector.empty[Json])
}
case Response(Left(l), _, _, _, _) => Vector.empty[Json]
}
println(users)
}
}
如果您尝试使用 REPL,您将得到如下结果
scala> val users = usersResponse.map {
| case Response(Right(r), _, _, _, _) => parse(r).map { json =>
| val users: Option[Vector[Json]] = json.asArray.map(arr => arr.flatMap(_.\\("login")))
| users.getOrElse(Vector.empty[Json])
| }
| case Response(Left(l), _, _, _, _) => Vector.empty[Json]
| }
users: scala.concurrent.Future[Serializable with Equals] = Future(<not completed>)
scala> users
res1: scala.concurrent.Future[Serializable with Equals] = Future(Success(Right(Vector("mojombo", "defunkt", "pjhyett", "wycats", "ezmobius", "ivey", "evanphx", "vanpelt", "wayneeseguin", "brynary", "kevinclark", "technoweenie", "macournoyer", "takeo", "Caged", "topfunky", "anotherjesse", "roland", "lukas", "fanvsfan", "tomtt", "railsjitsu", "nitay", "kevwil", "KirinDave", "jamesgolick", "atmos", "errfree", "mojodna", "bmizerany"))))
推荐阅读
- c# - setparent new cmd windows 10中的问题
- python - 纱线集群上的火花创建一个火花作业,其工人数量远小于火花上下文中指定的数量
- android - 使用 SQLite.Net-PCL [Xamarin.Android] 在 Android 9.0 中编译应用程序时出错
- php - 更新 mySQL - Wordpress HTML 表单
- sql - 将 SQL Server 的 FOR JSON 函数用于数值和 JSON 输入
- scala - 计算增量类型不匹配错误的无形示例
- f# - 什么是错误“类型实例化涉及 byref 类型。” 什么是 F# 中的解决方法
- java - 在指定页面打开 PDF 在 Java 中与平台无关
- c++ - 拖动时QGraphicsPolygonItem不更新QPolygonF坐标
- assembly - 运行代码时出现错误 MIPS “spim: (parser) syntax error”