J'essaie d'analyser les données JSON renvoyées par une requête HTTP comme ci-dessous. import scalaj.http. {Http, HttpResponse}
name := "ScalaRest" version := "0.1" scalaVersion := "2.11.8" libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.3.0"
Les données viennent dans les pages donc j'ai parcouru toutes les pages manuellement de 1 à 15 et chaque page renvoie un élément donné ci-dessous.
Lorsque j'imprime la chaîne: L jsonFile , je vois la chaîne au format ci-dessous:
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)))
Bibliothèques utilisées:
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)
}
}
}
Il a des cartes, des ensembles dans la chaîne que je ne comprends pas comment analyser. À partir de la chaîne ci-dessus qui est au format JSON, comment puis-je analyser les données et extraire les données des éléments: id, starttime, endtime, duration
3 Réponses :
Utilisation de play.api.libs.json._ Vous pouvez le faire via des implicits et des classes de cas
Définissez la classe de cas comme ceci:
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]
)
Définissez des formats implicites pour les classes de cas:
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]
}
Utilisez validate pour créer la classe de cas à partir du 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 )
Voici un Scalafiddle montrant comment le faire, j'ai ajouté des options à certains des champs parfois manquants. J'espère que cela aide https://scalafiddle.io/sf/J5dDfFo/3
p >
Et bien sûr, une fois que vous l'analysez, vous pouvez accéder facilement aux champs à l'intérieur de l'objet json par exemple .sport_type.id et ainsi de suite.
J'ai également utilisé ces sites Web: jsonformatter.org/json-pretty-print et json2caseclass.cleverapps.io
Vous pouvez essayer uJson, qui est très rapide et intuitif. Pas besoin de classes dédiées ou d'analyseurs implicites. Je l'ai utilisé dans plusieurs projets:
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 chapeau est une bonne solution. Vous devez ajouter les importations et ainsi de suite. Faites-en également un scalafiddle et montrez-en une version test exécutable: D
-1 car uJson n'a pas corrigé la vulnérabilité de sécurité: reddit.com/r/scala / comments / dbmetd /… - une option beaucoup plus sûre et efficace consisterait à utiliser Dijon 0.3.0: github.com/pathikrit/dijon
haha vous êtes impitoyable. Cela vous dérangerait-il de relier ce qu'est le problème de sécurité? De plus, si vous proposez une solution meilleure, cela vous dérangerait-il d'utiliser l'exemple ci-dessus et de montrer comment cela est fait en utilisant cette bibliothèque? Si c'est moins de code et une meilleure solution, ce serait bien à voir. EDIT: Nevermind, voyez que vous avez écrit une réponse maintenant.
Qu'avez-vous essayé / code? Quelle bibliothèque utilisez-vous?
Utilisation de la bibliothèque scalaJ. J'ai mis à jour la question avec le contenu du fichier build.sbt
scala.util.parsing.jsonest obsolète depuis plus de 3 ans maintenant (pour de très bonnes raisons) . Je vous recommande d'utiliser une bibliothèque appropriée comme Circe , json4s , play-json , uJson , etc.