【问题标题】:How to parse Json data returned from a HTTP request in scala如何解析从Scala中的HTTP请求返回的Json数据
【发布时间】:2019-10-06 03:15:12
【问题描述】:

我正在尝试解析从 HTTP 请求返回的 JSON 数据,如下所示。 导入 scalaj.http.{Http, HttpResponse}

import scala.util.parsing.json.JSON
import scalaj.http.{Http, HttpResponse}

object ScalaHttp {
    def main(args: Array[String]): Unit = {
        def get(url: String,i: Int) = Http(url).param("page",i.toString)
        for(i <- 1 to 15 by 1) {
            var jsonFile = get("url",i).asString
            println(jsonFile)
        }
    }
}

数据以页面形式出现,因此我手动从 1 到 15 遍历所有页面,每个页面返回一个元素,如下所示。 当我打印字符串:L jsonFile 时,我看到以下格式的字符串:

HttpResponse({"run_sessions":[{"id":9003843,"start_time":"2012-02-22T10:59:06.000Z","end_time":"2012-02-22T11:52:43.000Z","duration":3217769,"distance":13644,"encoded_trace":null,"sport_type_id":3},{"id":9000024,"start_time":"2012-02-22T09:12:51.000Z","end_time":"2012-02-22T18:49:26.000Z","duration":7009,"distance":0,"encoded_trace":null,"sport_type_id":7},{"id":9003605,"start_time":"2012-02-21T12:21:00.000Z","end_time":"2012-02-21T12:43:47.000Z","duration":1367000,"distance":2600,"encoded_trace":"kd}wHuo~n@?fDlCbG?vE{@|GfB|FmAjHzCtIzBmEhAgGcE}DuDyEuE}DaCeEAsHjDSrBnDlBaA_EuGf@aEGjD","sport_type_id":1},{"id":9003604,"start_time":"2012-02-21T12:21:00.000Z","end_time":"2012-02-21T12:44:02.000Z","duration":1382000,"distance":2600,"encoded_trace":"gd}wHiq~n@_@hDvDpGe@nEi@tG~C|FgDtFxCjKvCaB`CqFsEuEgDcFkEsCaCyH{@}D|CmBrBhCxCp@oE}Hb@wEDn@","sport_type_id":1},{"id":9003952,"start_time":"2012-02-21T12:15:00.000Z","end_time":"2012-02-21T12:59:59.000Z","duration":2699120,"distance":6990,"encoded_trace":"ktcsGi~x]{@]rD~@{Jt@k@jI{BfJqJ{a@f@xa@}CmGsHa\\\\KhJsD}CaA}MrO{`@cCrL|Iub@hCsJvAyClB}DxAqD`EtA}End@rCtFdKiQbCdAbDaH~B}FjAlDbGlCvMmCyLf\\\\?nEnAhL{B|H}@hEvWiPqBbEan@|\\\\h@oDqBrCuDgILaHhBeFzGgFxE|@pB|BdBnCl@rC{Bt@qB~BJnG}@tA","sport_type_id":1},{"id":9004251,"start_time":"2012-02-21T12:07:13.000Z","end_time":"2012-02-21T14:38:45.000Z","duration":7820873,"distance":54670,"encoded_trace":"ybtzHqgx_@ifAp}Bw^n}B{Dl{DhBlqDqzCvi@aWdaDtf@~tCru@x~CdL~mExYjuEhoBqNvlC{gAbtA`mAxByyCx@{eFm`@wuF_j@elGiMqeG_k@a{E_y@w`D","sport_type_id":4},{"id":9004249,"start_time":"2012-02-21T12:07:04.000Z","end_time":"2012-02-21T13:41:35.000Z","duration":5676621,"distance":8909,"encoded_trace":"irveHulcvAMP{CzWiGvEyEtCs@uHiDzIqBfH{ErH{ExD{HuBgFvA{Dr@o@jH}D`GqFpE}GeBvAmExBqFjOcBRzDkEvFeH`GgGy@n@iIdEmHtO`@uGxLcL|EaC_GjDkFxMaF`DxDiErGkGhFsFVk@qHxCqF`QaGnHgCfEjAdGB|FoDlDgFbCgIpBcGrBJrArFxAkIhGuCzDa@?yU","sport_type_id":2},{"id":9004252,"start_time":"2012-02-21T12:07:00.000Z","end_time":null,"duration":0,"distance":0,"encoded_trace":null,"sport_type_id":1},{"id":9004245,"start_time":"2012-02-21T12:06:51.000Z","end_time":"2012-02-21T12:39:51.000Z","duration":1760262,"distance":4579,"encoded_trace":"axfvBrsr|Q?GTeCp@_EdBkD|@uD\\\\sDVuA}@`DWpDs@nDiAzCaAvDIn@r@oDhAmDdAsDd@cDb@}CJ_Aq@~Da@`Di@lDyArCq@dDSlBj@iDr@{CzA_Et@cEDaC`AqCeAxC?zBu@pCq@rCsAxCk@rCOfAl@aDbAwDrA_Dp@iDV}CRiAq@|De@rDk@zCkAnC_AhDSdC","sport_type_id":1},{"id":9004243,"start_time":"2012-02-21T12:06:48.000Z","end_time":"2012-02-21T13:05:57.000Z","duration":3547966,"distance":8096,"encoded_trace":"ckrtGs_ew@cZ_R_]gXg\\\\hAaJu@iBwJ_N{OuHuGiE{XKgNlCcLkAhLNbN`Kt_@dQxSnFnMzL}UfOxL`f@da@|VdV??","sport_type_id":1},{"id":9004239,"start_time":"2012-02-21T12:06:48.000Z","end_time":"2012-02-21T14:53:22.000Z","duration":9985106,"distance":13048,"encoded_trace":null,"sport_type_id":2},{"id":9004238,"start_time":"2012-02-21T12:06:47.000Z","end_time":"2012-02-21T12:21:38.000Z","duration":891191,"distance":2721,"encoded_trace":"u{ckGiy`LBHPjBHrBpAxAPnBIdC]xCU`CVpBF~BLnBpArA|ApAjAj@lAn@hBj@~A_@lBKbAmBb@eB?aCEgA}Aw@w@NiA]iAOuAF{Bp@kA`BX|B^~BxAvAxAp@jBi@`@iDb@wCmAs@}AYQaAL{Bd@uBVyCL{CY}AyAAuAKiBs@}AgA}@uAoAcB]g@","sport_type_id":1},{"id":9004232,"start_time":"2012-02-21T12:06:34.000Z","end_time":"2012-02-21T12:08:16.000Z","duration":101937,"distance":845,"encoded_trace":null,"sport_type_id":9},{"id":9004230,"start_time":"2012-02-21T12:06:30.000Z","end_time":null,"duration":0,"distance":0,"encoded_trace":null,"sport_type_id":1},{"id":9004226,"start_time":"2012-02-21T12:06:18.000Z","end_time":null,"duration":0,"distance":0,"encoded_trace":null,"sport_type_id":5}],"meta":{"pagination":{"per_page":15,"available_pages":71,"total":1059,"page":"1","sort_by":"start_time","order":"desc"}}},200,Map(Cache-Control -> Vector(max-age=0, private, must-revalidate), Connection -> Vector(keep-alive), Content-Length -> Vector(3727), Content-Type -> Vector(application/json; charset=utf-8), Date -> Vector(Tue, 01 Oct 2019 11:44:24 GMT), Etag -> Vector("2269df166d2348a8adc43b8170651bc8"), Server -> Vector(WEBrick/1.3.1 (Ruby/1.9.3/2014-05-14)), Set-Cookie -> Vector(request_method=GET; path=/), Status -> Vector(HTTP/1.1 200 OK), Via -> Vector(1.1 vegur), X-Content-Type-Options -> Vector(nosniff), X-Frame-Options -> Vector(SAMEORIGIN), X-Request-Id -> Vector(321da733-1172-4547-90a2-42d5d3b027fa), X-Runtime -> Vector(0.068370), X-Ua-Compatible -> Vector(chrome=1), X-Xss-Protection -> Vector(1; mode=block)))

使用的库:

name := "ScalaRest"

version := "0.1"

scalaVersion := "2.11.8"
libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.3.0"

它在我不明白如何解析的字符串中有 Maps, Sets。 从上面的 JSON 格式的字符串中,我如何解析数据并提取元素的数据:id、starttime、endtime、duration

【问题讨论】:

  • 你尝试过什么/编码?你使用哪个库?
  • 使用 scalaJ 库。我已经用 build.sbt 文件的内容更新了问题
  • scala.util.parsing.json 已被弃用超过 3 年(出于很好的理由)。我建议您使用合适的库,例如 Circejson4splay-jsonuJson 等。

标签: json scala


【解决方案1】:

您可以尝试uJson,,它非常快速且直观。不需要专用的类或隐式解析器。我在多个项目中使用过它:

val json = ujson.read(Http("my_url").asString.body))
val tuples = json("run_sessions").arr /* <-- run_sessions is an array */ .map { item => 
    (item("id"), item("start_time"), item("end_time"), item("duration")) 
}

【讨论】:

  • +1 帽子是一个不错的解决方案。您应该添加导入等。也用它制作一个 scalafiddle 并显示它的可运行测试版本:D
  • -1 因为 uJson 没有修复安全漏洞:reddit.com/r/scala/comments/dbmetd/… - 使用第戎 0.3.0 更安全、更高效的选择:github.com/pathikrit/dijon
  • 哈哈,你真是无情。您介意将安全问题联系起来吗?此外,如果您要提出一个更好的解决方案,您介意使用上面的示例并展示它是如何使用这个库完成的吗?如果它是更少的代码和更好的解决方案,那就太好了。编辑:没关系,看到你现在写了一个答案。
【解决方案2】:

使用 play.api.libs.json._ 你可以通过隐式和案例类来做到这一点

像这样定义案例类:

import play.api.libs.json._

 case class Run_sessions(
  id: Double,
  start_time: String,
  end_time: Option[String],
  duration: Double,
  distance: Double,
  encoded_trace: Option[String],
  sport_type_id: Double
)
case class Pagination(
  per_page: Double,
  available_pages: Double,
  total: Double,
  page: String,
  sort_by: String,
  order: String
)
case class MetaBis(
  pagination: Pagination
)
case class RootJsonObject(
  run_sessions: List[Run_sessions],
  meta: MetaBis
)

为案例类定义一些隐式格式:

object formatters {
implicit val a: Format[Run_sessions] = Json.format[Run_sessions]
implicit val b: Format[Pagination] = Json.format[Pagination]
implicit val c: Format[MetaBis] = Json.format[MetaBis]
implicit val d: Format[RootJsonObject] = Json.format[RootJsonObject]
}

使用 validate 从 Json 创建案例类

val json = Json.parse("""{

  "run_sessions": [
    {
      "id": 9003843,
      "start_time": "2012-02-22T10:59:06.000Z",
      "end_time": "2012-02-22T11:52:43.000Z",
      "duration": 3217769,
      "distance": 13644,
      "encoded_trace": null,
      "sport_type_id": 3
    },
    {
      "id": 9000024,
      "start_time": "2012-02-22T09:12:51.000Z",
      "end_time": "2012-02-22T18:49:26.000Z",
      "duration": 7009,
      "distance": 0,
      "encoded_trace": null,
      "sport_type_id": 7
    },
    {
      "id": 9003605,
      "start_time": "2012-02-21T12:21:00.000Z",
      "end_time": "2012-02-21T12:43:47.000Z",
      "duration": 1367000,
      "distance": 2600,
      "encoded_trace": "kd}wHuo~n@?fDlCbG?vE{@|GfB|FmAjHzCtIzBmEhAgGcE}DuDyEuE}DaCeEAsHjDSrBnDlBaA_EuGf@aEGjD",
      "sport_type_id": 1
    },
    {
      "id": 9003604,
      "start_time": "2012-02-21T12:21:00.000Z",
      "end_time": "2012-02-21T12:44:02.000Z",
      "duration": 1382000,
      "distance": 2600,
      "encoded_trace": "gd}wHiq~n@_@hDvDpGe@nEi@tG~C|FgDtFxCjKvCaB`CqFsEuEgDcFkEsCaCyH{@}D|CmBrBhCxCp@oE}Hb@wEDn@",
      "sport_type_id": 1
    },
    {
      "id": 9003952,
      "start_time": "2012-02-21T12:15:00.000Z",
      "end_time": "2012-02-21T12:59:59.000Z",
      "duration": 2699120,
      "distance": 6990,
      "encoded_trace": "ktcsGi~x]{@]rD~@{Jt@k@jI{BfJqJ{a@f@xa@}CmGsHa\\\\KhJsD}CaA}MrO{`@cCrL|Iub@hCsJvAyClB}DxAqD`EtA}End@rCtFdKiQbCdAbDaH~B}FjAlDbGlCvMmCyLf\\\\?nEnAhL{B|H}@hEvWiPqBbEan@|\\\\h@oDqBrCuDgILaHhBeFzGgFxE|@pB|BdBnCl@rC{Bt@qB~BJnG}@tA",
      "sport_type_id": 1
    },
    {
      "id": 9004251,
      "start_time": "2012-02-21T12:07:13.000Z",
      "end_time": "2012-02-21T14:38:45.000Z",
      "duration": 7820873,
      "distance": 54670,
      "encoded_trace": "ybtzHqgx_@ifAp}Bw^n}B{Dl{DhBlqDqzCvi@aWdaDtf@~tCru@x~CdL~mExYjuEhoBqNvlC{gAbtA`mAxByyCx@{eFm`@wuF_j@elGiMqeG_k@a{E_y@w`D",
      "sport_type_id": 4
    },
    {
      "id": 9004249,
      "start_time": "2012-02-21T12:07:04.000Z",
      "end_time": "2012-02-21T13:41:35.000Z",
      "duration": 5676621,
      "distance": 8909,
      "encoded_trace": "irveHulcvAMP{CzWiGvEyEtCs@uHiDzIqBfH{ErH{ExD{HuBgFvA{Dr@o@jH}D`GqFpE}GeBvAmExBqFjOcBRzDkEvFeH`GgGy@n@iIdEmHtO`@uGxLcL|EaC_GjDkFxMaF`DxDiErGkGhFsFVk@qHxCqF`QaGnHgCfEjAdGB|FoDlDgFbCgIpBcGrBJrArFxAkIhGuCzDa@?yU",
      "sport_type_id": 2
    },
    {
      "id": 9004252,
      "start_time": "2012-02-21T12:07:00.000Z",
      "end_time": null,
      "duration": 0,
      "distance": 0,
      "encoded_trace": null,
      "sport_type_id": 1
    },
    {
      "id": 9004245,
      "start_time": "2012-02-21T12:06:51.000Z",
      "end_time": "2012-02-21T12:39:51.000Z",
      "duration": 1760262,
      "distance": 4579,
      "encoded_trace": "axfvBrsr|Q?GTeCp@_EdBkD|@uD\\\\sDVuA}@`DWpDs@nDiAzCaAvDIn@r@oDhAmDdAsDd@cDb@}CJ_Aq@~Da@`Di@lDyArCq@dDSlBj@iDr@{CzA_Et@cEDaC`AqCeAxC?zBu@pCq@rCsAxCk@rCOfAl@aDbAwDrA_Dp@iDV}CRiAq@|De@rDk@zCkAnC_AhDSdC",
      "sport_type_id": 1
    },
    {
      "id": 9004243,
      "start_time": "2012-02-21T12:06:48.000Z",
      "end_time": "2012-02-21T13:05:57.000Z",
      "duration": 3547966,
      "distance": 8096,
      "encoded_trace": "ckrtGs_ew@cZ_R_]gXg\\\\hAaJu@iBwJ_N{OuHuGiE{XKgNlCcLkAhLNbN`Kt_@dQxSnFnMzL}UfOxL`f@da@|VdV??",
      "sport_type_id": 1
    },
    {
      "id": 9004239,
      "start_time": "2012-02-21T12:06:48.000Z",
      "end_time": "2012-02-21T14:53:22.000Z",
      "duration": 9985106,
      "distance": 13048,
      "encoded_trace": null,
      "sport_type_id": 2
    },
    {
      "id": 9004238,
      "start_time": "2012-02-21T12:06:47.000Z",
      "end_time": "2012-02-21T12:21:38.000Z",
      "duration": 891191,
      "distance": 2721,
      "encoded_trace": "u{ckGiy`LBHPjBHrBpAxAPnBIdC]xCU`CVpBF~BLnBpArA|ApAjAj@lAn@hBj@~A_@lBKbAmBb@eB?aCEgA}Aw@w@NiA]iAOuAF{Bp@kA`BX|B^~BxAvAxAp@jBi@`@iDb@wCmAs@}AYQaAL{Bd@uBVyCL{CY}AyAAuAKiBs@}AgA}@uAoAcB]g@",
      "sport_type_id": 1
    },
    {
      "id": 9004232,
      "start_time": "2012-02-21T12:06:34.000Z",
      "end_time": "2012-02-21T12:08:16.000Z",
      "duration": 101937,
      "distance": 845,
      "encoded_trace": null,
      "sport_type_id": 9
    },
    {
      "id": 9004230,
      "start_time": "2012-02-21T12:06:30.000Z",
      "end_time": null,
      "duration": 0,
      "distance": 0,
      "encoded_trace": null,
      "sport_type_id": 1
    },
    {
      "id": 9004226,
      "start_time": "2012-02-21T12:06:18.000Z",
      "end_time": null,
      "duration": 0,
      "distance": 0,
      "encoded_trace": null,
      "sport_type_id": 5
    }
  ],
  "meta": {
    "pagination": {
      "per_page": 15,
      "available_pages": 71,
      "total": 1059,
      "page": "1",
      "sort_by": "start_time",
      "order": "desc"
    }
  }
}""")

  import formatters._
  println(
    json.validate[RootJsonObject]
  )

这是一个 Scalafiddle,展示了如何做到这一点,我在一些有时缺少的字段中添加了选项。希望能帮助到你 https://scalafiddle.io/sf/J5dDfFo/3

【讨论】:

【解决方案3】:

解析该 HTTP 响应正文的最安全有​​效的方法是使用 jsoniter-scala

1) 添加依赖:

libraryDependencies ++= Seq(
  "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core"   % "0.55.4" % Compile,
  "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "0.55.4" % Provided // required only in compile-time
)

2) 定义数据结构,为根结构派生编解码器并解析响应体:

import java.time.Instant

import com.github.plokhotnyuk.jsoniter_scala.macros._
import com.github.plokhotnyuk.jsoniter_scala.core._

case class Response(
  run_sessions: List[RunSession],
  meta: Meta)

case class RunSession(
  id: Int,
  start_time: Instant,
  end_time: Option[Instant],
  duration: Int,
  distance: Int,
  encoded_trace: Option[String],
  sport_type_id: Int)

case class Meta(pagination: Pagination)

case class Pagination(
  per_page: Int,
  available_pages: Int,
  total: Int,
  @stringified page: Int,
  sort_by: String,
  order: String)

implicit val codec: JsonValueCodec[Response] = JsonCodecMaker.make(CodecMakerConfig())

val body: Array[Byte] = """{"run_sessions":[{"id":9003843,"start_time":"2012-02-22T10:59:06.000Z","end_time":"2012-02-22T11:52:43.000Z","duration":3217769,"distance":13644,"encoded_trace":null,"sport_type_id":3},{"id":9000024,"start_time":"2012-02-22T09:12:51.000Z","end_time":"2012-02-22T18:49:26.000Z","duration":7009,"distance":0,"encoded_trace":null,"sport_type_id":7},{"id":9003605,"start_time":"2012-02-21T12:21:00.000Z","end_time":"2012-02-21T12:43:47.000Z","duration":1367000,"distance":2600,"encoded_trace":"kd}wHuo~n@?fDlCbG?vE{@|GfB|FmAjHzCtIzBmEhAgGcE}DuDyEuE}DaCeEAsHjDSrBnDlBaA_EuGf@aEGjD","sport_type_id":1},{"id":9003604,"start_time":"2012-02-21T12:21:00.000Z","end_time":"2012-02-21T12:44:02.000Z","duration":1382000,"distance":2600,"encoded_trace":"gd}wHiq~n@_@hDvDpGe@nEi@tG~C|FgDtFxCjKvCaB`CqFsEuEgDcFkEsCaCyH{@}D|CmBrBhCxCp@oE}Hb@wEDn@","sport_type_id":1},{"id":9003952,"start_time":"2012-02-21T12:15:00.000Z","end_time":"2012-02-21T12:59:59.000Z","duration":2699120,"distance":6990,"encoded_trace":"ktcsGi~x]{@]rD~@{Jt@k@jI{BfJqJ{a@f@xa@}CmGsHa\\\\KhJsD}CaA}MrO{`@cCrL|Iub@hCsJvAyClB}DxAqD`EtA}End@rCtFdKiQbCdAbDaH~B}FjAlDbGlCvMmCyLf\\\\?nEnAhL{B|H}@hEvWiPqBbEan@|\\\\h@oDqBrCuDgILaHhBeFzGgFxE|@pB|BdBnCl@rC{Bt@qB~BJnG}@tA","sport_type_id":1},{"id":9004251,"start_time":"2012-02-21T12:07:13.000Z","end_time":"2012-02-21T14:38:45.000Z","duration":7820873,"distance":54670,"encoded_trace":"ybtzHqgx_@ifAp}Bw^n}B{Dl{DhBlqDqzCvi@aWdaDtf@~tCru@x~CdL~mExYjuEhoBqNvlC{gAbtA`mAxByyCx@{eFm`@wuF_j@elGiMqeG_k@a{E_y@w`D","sport_type_id":4},{"id":9004249,"start_time":"2012-02-21T12:07:04.000Z","end_time":"2012-02-21T13:41:35.000Z","duration":5676621,"distance":8909,"encoded_trace":"irveHulcvAMP{CzWiGvEyEtCs@uHiDzIqBfH{ErH{ExD{HuBgFvA{Dr@o@jH}D`GqFpE}GeBvAmExBqFjOcBRzDkEvFeH`GgGy@n@iIdEmHtO`@uGxLcL|EaC_GjDkFxMaF`DxDiErGkGhFsFVk@qHxCqF`QaGnHgCfEjAdGB|FoDlDgFbCgIpBcGrBJrArFxAkIhGuCzDa@?yU","sport_type_id":2},{"id":9004252,"start_time":"2012-02-21T12:07:00.000Z","end_time":null,"duration":0,"distance":0,"encoded_trace":null,"sport_type_id":1},{"id":9004245,"start_time":"2012-02-21T12:06:51.000Z","end_time":"2012-02-21T12:39:51.000Z","duration":1760262,"distance":4579,"encoded_trace":"axfvBrsr|Q?GTeCp@_EdBkD|@uD\\\\sDVuA}@`DWpDs@nDiAzCaAvDIn@r@oDhAmDdAsDd@cDb@}CJ_Aq@~Da@`Di@lDyArCq@dDSlBj@iDr@{CzA_Et@cEDaC`AqCeAxC?zBu@pCq@rCsAxCk@rCOfAl@aDbAwDrA_Dp@iDV}CRiAq@|De@rDk@zCkAnC_AhDSdC","sport_type_id":1},{"id":9004243,"start_time":"2012-02-21T12:06:48.000Z","end_time":"2012-02-21T13:05:57.000Z","duration":3547966,"distance":8096,"encoded_trace":"ckrtGs_ew@cZ_R_]gXg\\\\hAaJu@iBwJ_N{OuHuGiE{XKgNlCcLkAhLNbN`Kt_@dQxSnFnMzL}UfOxL`f@da@|VdV??","sport_type_id":1},{"id":9004239,"start_time":"2012-02-21T12:06:48.000Z","end_time":"2012-02-21T14:53:22.000Z","duration":9985106,"distance":13048,"encoded_trace":null,"sport_type_id":2},{"id":9004238,"start_time":"2012-02-21T12:06:47.000Z","end_time":"2012-02-21T12:21:38.000Z","duration":891191,"distance":2721,"encoded_trace":"u{ckGiy`LBHPjBHrBpAxAPnBIdC]xCU`CVpBF~BLnBpArA|ApAjAj@lAn@hBj@~A_@lBKbAmBb@eB?aCEgA}Aw@w@NiA]iAOuAF{Bp@kA`BX|B^~BxAvAxAp@jBi@`@iDb@wCmAs@}AYQaAL{Bd@uBVyCL{CY}AyAAuAKiBs@}AgA}@uAoAcB]g@","sport_type_id":1},{"id":9004232,"start_time":"2012-02-21T12:06:34.000Z","end_time":"2012-02-21T12:08:16.000Z","duration":101937,"distance":845,"encoded_trace":null,"sport_type_id":9},{"id":9004230,"start_time":"2012-02-21T12:06:30.000Z","end_time":null,"duration":0,"distance":0,"encoded_trace":null,"sport_type_id":1},{"id":9004226,"start_time":"2012-02-21T12:06:18.000Z","end_time":null,"duration":0,"distance":0,"encoded_trace":null,"sport_type_id":5}],"meta":{"pagination":{"per_page":15,"available_pages":71,"total":1059,"page":"1","sort_by":"start_time","order":"desc"}}}""".getBytes("UTF-8")
val response: Response = readFromArray(body)

3) [可选] 打印解析结果

print(response)

// Response(List(RunSession(9003843,2012-02-22T10:59:06Z,Some(2012-02-22T11:52:43Z),3217769,13644,None,3), RunSession(9000024,2012-02-22T09:12:51Z,Some(2012-02-22T18:49:26Z),7009,0,None,7), RunSession(9003605,2012-02-21T12:21:00Z,Some(2012-02-21T12:43:47Z),1367000,2600,Some(kd}wHuo~n@?fDlCbG?vE{@|GfB|FmAjHzCtIzBmEhAgGcE}DuDyEuE}DaCeEAsHjDSrBnDlBaA_EuGf@aEGjD),1), RunSession(9003604,2012-02-21T12:21:00Z,Some(2012-02-21T12:44:02Z),1382000,2600,Some(gd}wHiq~n@_@hDvDpGe@nEi@tG~C|FgDtFxCjKvCaB`CqFsEuEgDcFkEsCaCyH{@}D|CmBrBhCxCp@oE}Hb@wEDn@),1), RunSession(9003952,2012-02-21T12:15:00Z,Some(2012-02-21T12:59:59Z),2699120,6990,Some(ktcsGi~x]{@]rD~@{Jt@k@jI{BfJqJ{a@f@xa@}CmGsHa\\KhJsD}CaA}MrO{`@cCrL|Iub@hCsJvAyClB}DxAqD`EtA}End@rCtFdKiQbCdAbDaH~B}FjAlDbGlCvMmCyLf\\?nEnAhL{B|H}@hEvWiPqBbEan@|\\h@oDqBrCuDgILaHhBeFzGgFxE|@pB|BdBnCl@rC{Bt@qB~BJnG}@tA),1), RunSession(9004251,2012-02-21T12:07:13Z,Some(2012-02-21T14:38:45Z),7820873,54670,Some(ybtzHqgx_@ifAp}Bw^n}B{Dl{DhBlqDqzCvi@aWdaDtf@~tCru@x~CdL~mExYjuEhoBqNvlC{gAbtA`mAxByyCx@{eFm`@wuF_j@elGiMqeG_k@a{E_y@w`D),4), RunSession(9004249,2012-02-21T12:07:04Z,Some(2012-02-21T13:41:35Z),5676621,8909,Some(irveHulcvAMP{CzWiGvEyEtCs@uHiDzIqBfH{ErH{ExD{HuBgFvA{Dr@o@jH}D`GqFpE}GeBvAmExBqFjOcBRzDkEvFeH`GgGy@n@iIdEmHtO`@uGxLcL|EaC_GjDkFxMaF`DxDiErGkGhFsFVk@qHxCqF`QaGnHgCfEjAdGB|FoDlDgFbCgIpBcGrBJrArFxAkIhGuCzDa@?yU),2), RunSession(9004252,2012-02-21T12:07:00Z,None,0,0,None,1), RunSession(9004245,2012-02-21T12:06:51Z,Some(2012-02-21T12:39:51Z),1760262,4579,Some(axfvBrsr|Q?GTeCp@_EdBkD|@uD\\sDVuA}@`DWpDs@nDiAzCaAvDIn@r@oDhAmDdAsDd@cDb@}CJ_Aq@~Da@`Di@lDyArCq@dDSlBj@iDr@{CzA_Et@cEDaC`AqCeAxC?zBu@pCq@rCsAxCk@rCOfAl@aDbAwDrA_Dp@iDV}CRiAq@|De@rDk@zCkAnC_AhDSdC),1), RunSession(9004243,2012-02-21T12:06:48Z,Some(2012-02-21T13:05:57Z),3547966,8096,Some(ckrtGs_ew@cZ_R_]gXg\\hAaJu@iBwJ_N{OuHuGiE{XKgNlCcLkAhLNbN`Kt_@dQxSnFnMzL}UfOxL`f@da@|VdV??),1), RunSession(9004239,2012-02-21T12:06:48Z,Some(2012-02-21T14:53:22Z),9985106,13048,None,2), RunSession(9004238,2012-02-21T12:06:47Z,Some(2012-02-21T12:21:38Z),891191,2721,Some(u{ckGiy`LBHPjBHrBpAxAPnBIdC]xCU`CVpBF~BLnBpArA|ApAjAj@lAn@hBj@~A_@lBKbAmBb@eB?aCEgA}Aw@w@NiA]iAOuAF{Bp@kA`BX|B^~BxAvAxAp@jBi@`@iDb@wCmAs@}AYQaAL{Bd@uBVyCL{CY}AyAAuAKiBs@}AgA}@uAoAcB]g@),1), RunSession(9004232,2012-02-21T12:06:34Z,Some(2012-02-21T12:08:16Z),101937,845,None,9), RunSession(9004230,2012-02-21T12:06:30Z,None,0,0,None,1), RunSession(9004226,2012-02-21T12:06:18Z,None,0,0,None,5)),Meta(Pagination(15,71,1059,1,start_time,desc)))

【讨论】:

  • 你介意解释一下为什么这比使用 play.api.libs.json._ 更好或更有效。当然,play 是超级繁重且令人讨厌的导入等。
猜你喜欢
  • 1970-01-01
  • 2016-08-17
  • 2018-07-30
  • 2012-12-07
  • 1970-01-01
  • 2017-06-13
  • 2021-08-31
  • 1970-01-01
  • 2013-12-21
相关资源
最近更新 更多