/ / Comment récupérer les données de json avec plusieurs niveaux avec scala - scala

Comment récupérer des données de json avec plusieurs niveaux avec scala - scala

Je veux récupérer des données du JSON, mais je peuxpas le code en scala, je ne peux que l'écrire en php, car il est très simple à utiliser, mais je ne sais pas comment puis-je faire la même chose en scala. Sil te plait aide moi.

{
"home": {
"type": "literal",
"options": {
"route": "/",
"defaults": {
"controller": "Apiv1\Controller\Index",
"action": "index"
}
}
},
"praise": {
"type": "literal",
"options": {
"route": "/apiv1/praise",
"defaults": {
"controller": "Apiv1\Controller\Praise",
"action": "index"
}
},
"may_terminate": true,
"child_routes": {
"status": {
"type": "literal",
"options": {
"route": "/status",
"defaults": {
"action": "status"
}
}
}
}
},
"admin": {
"type": "literal",
"options": {
"route": "/admin",
"defaults": {
"controller": "Admin\Controller\Index",
"action": "index"
}
},
"may_terminate": true,
"child_routes": {
"routes": {
"type": "literal",
"options": {
"route": "/routes",
"defaults": {
"controller": "Admin\Controller\Routes",
"action": "index"
}
},
"may_terminate": true,
"child_routes": {
"list": {
"type": "literal",
"options": {
"route": "/list",
"defaults": {
"action": "list"
}
}
}
}
}
}
}
}

Je veux ramasser le champ de route du json, et je voudrais énumérer toutes les routes

voici ma fonction de version php

function parseRoute($a, $pre = "", &$urls)
{
foreach ($a as $k => $v) {
$route = $pre . $v["options"]["route"];
$urls[] = $route;
if (isset($v["child_routes"]) && is_array($v["child_routes"])) {
$this->parseRoute($v["child_routes"], $route, $urls);
}
$route = null;
}
}
$urls = array();
var_dump(parseRoute(json_decode($data), "", $urls));

Réponses:

0 pour la réponse № 1

La meilleure chose à faire est d'utiliser l'une des bibliothèques JSON existantes pour Scala. Voici une question connexe décrivant vos options:

Quelle bibliothèque JSON à utiliser dans Scala?

Suivant est un exemple d'utilisation Lift-JSON. Voir le lien, il y a beaucoup d'exemples. Voici ce que vous pouvez faire:

import net.liftweb.json._

val rawJson = """{
"home":{
"type":"literal",
"options":{
"route":"/",
"defaults":{
"controller":"Apiv1\Controller\Index",
"action":"index"
}
}
},
"praise":{
"type":"literal",
"options":{
"route":"/apiv1/praise",
"defaults":{
"controller":"Apiv1\Controller\Praise",
"action":"index"
}
},
"may_terminate":true,
"child_routes":{
"status":{
"type":"literal",
"options":{
"route":"/status",
"defaults":{
"action":"status"
}
}
}
}
},
"admin":{
"type":"literal",
"options":{
"route":"/admin",
"defaults":{
"controller":"Admin\Controller\Index",
"action":"index"
}
},
"may_terminate":true,
"child_routes":{
"routes":{
"type":"literal",
"options":{
"route":"/routes",
"defaults":{
"controller":"Admin\Controller\Routes",
"action":"index"
}
},
"may_terminate":true,
"child_routes":{
"list":{
"type":"literal",
"options":{
"route":"/list",
"defaults":{
"action":"list"
}
}
}
}
}
}
}
}"""

val json = parse(rawJson)

val routeList = json \ "route"
// which returns a structure like this:
JObject(List(JField(route,JString(/)), JField(route,JString(/apiv1/praise)), JField(route,JString(/status)), JField(route,JString(/admin)), JField(route,JString(/routes)), JField(route,JString(/list))))
// which is a JSON object

// if you want a list of routes as strings as in your example extract them this way now:
val routeList: List[String] = routeObject \ classOf[JString]
// which returns:
List[String] = List(/, /apiv1/praise, /status, /admin, /routes, /list)

Notez que je "suppose que les itinéraires peuvent être à toutniveau d'imbrication dans la documentation JSON (vous pouvez appliquer un certain niveau ou un parent de la "route"). Je suppose également que tous les itinéraires sont des chaînes et ignore ceux qui ne le sont pas. Si vous souhaitez davantage d’options, vous pouvez rechercher un modèle sur le type d’itinéraire en utilisant des classes dérivées de JValue: JArray, JString, JObject, etc.