【问题标题】:Parse get request to jsonarray in Scala在 Scala 中解析对 jsonarray 的请求
【发布时间】:2018-11-12 01:41:55
【问题描述】:

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

【问题讨论】:

    标签: json scala rest


    【解决方案1】:

    您可以使用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"))))
    

    【讨论】:

    • 对不起,我明白了。我必须添加 libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.3" % Runtime 到 build.sbt
    • 它有效。但我很抱歉每秒都有一些输出。如何关闭它?
    猜你喜欢
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    相关资源
    最近更新 更多