首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Scala中解析对jsonarray的get请求

在Scala中解析对jsonarray的get请求
EN

Stack Overflow用户
提问于 2018-06-02 06:02:15
回答 1查看 489关注 0票数 1

请求https://api.github.com/users返回一个用户列表。如何在Scala中将其解析为json对象数组,以便访问对象的字段,例如,login、id、...

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 06:27:20

您可以使用sttp-client进行http调用,使用circe将json解码为scala对象。

代码语言:javascript
复制
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
)

例如,

代码语言:javascript
复制
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,您将得到如下结果

代码语言:javascript
复制
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"))))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50651472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档