Lecture d'un fichier JSON

Bonjour.

Je m’intéresse en ce moment à la lecture d’un fichier JSON. Je ne comprends pas bien la doc de 4D en fait. J’ai besoin de lire une valeur dans ce fichier, mais je n’arrive pas à la récuperer.

En gros voici le contenu de mon JSON

{
“routes”:[

{
  "legs" : [
     "distance" : {
       "text" : "75,6 km",
       "value" : 75635
     },

      "duration" : {
        "text" : "53 minutes",
        "value" : 3209
      },

    }
   ],
 }

],
}

J’aimerai récuperer les valeurs dans distance(text et value) & les valeurs dans duration(text et value). Le JSON est créé par google Maps donc ces valeurs varient à chaque calcul d’itinéraire. (Et évidemment, le JSON contient d’autres objets et données).
Je ne comprends pas bien comment fonctionne les fonctions JSON de 4D (JSON Parse et JSON PARSE ARRAY). Je m’y prends surement mal, mais je crois que je suis buté sur la façon d’exploiter ce type de fichiers grace à d’autres langages …
Des pistes ?

Bonjour

Vite fait comme ça, je dirais que tu parses le tableau des routes, tu obtiens un tableaux d’objets, appelons-le $to_routes

Ensuite tu balaies ce tableau $to_routes, tu parses chaque ligne, tu obtiens un tableau $to_legs

Dans chaque ligne de $to_legs tu as un objet distance et un objet duration que tu peux parser à leur tour pour en connaître les attributs text et value

Bonjour,

Voici un exemple :

<code 4D>
C_OBJET($value)
$folder_itemType:=Dossier 4D(Dossier Resources courant)+Remplacer chaîne(“basicData/itemType/”;"/";Séparateur dossier)
$json:=Document vers texte($folder_itemType+“value.json”;“UTF-8”)
$value:=JSON Parse($json)

</code 4D>

Cordialement,

Pour de versions antérieures a v14 les objects et les commandes JSON ne sont pas disponibles.
Si tu es en v13 tu devras utiliser des plugins (Miyako’s, NTK).

Etant parfois un auditeur attentif du dernier summit, il y a des pépites pour analyser ce genre de JSON répétitif. Etudie bien l’entête de la méthode avec les exemples d’utilisation, c’est très puissant :

<code 4D>
// OB_Lire_texte ( [objet] ; “element.attribut.SousAttribut” ) -> “résultat”
// “element[First] element[2] element[?moyen=bateau] element[Last]”
// d’après Olivier DESCHANELS

// $adresse:=OB_Lire_texte (Objet;“results[F].formatted_address”)
// $latitude:=OB_Lire_reel (Objet;“results[F].geometry.location.lat”)
// $latitude:=OB_Lire_reel (Objet;“results[?formatted_address=134@].geometry.location.lat”)

C_OBJET($1;$objet)
C_TEXTE($0;$2;$path;$resultat;$attribut;$item)
C_ENTIER LONG($last_type;$posPoint;$posCrochet;$posEgal)

$objet:=$1
$path:=$2

Tant que (Position(".";$path)>0)

$posPoint:=Position(".";$path)
$posCrochet:=Position("[";$path)

Au cas ou 
		
	: ($posCrochet<$posPoint) & ($posCrochet>0)
		
		$attribut:=Sous chaîne($path;1;$posCrochet-1)
		TABLEAU OBJET($tableauObjets;0)
		OB LIRE TABLEAU($objet;$attribut;$tableauObjets)
		$item:=Sous chaîne($path;$posCrochet+1;$posPoint-$posCrochet-2)
		
		Au cas ou 
				
			: ($item="?@")  // [?moyen=bateau]
				
				$posEgal:=Position("=";$item)
				
				Si ($posEgal>0)
					
					$attribut_cible:=Sous chaîne($item;2;$posEgal-2)  // moyen
					$valeur_cible:=Sous chaîne($item;$posEgal+1)  // bateau
					$indice:=0
					
					Boucle ($o;1;Taille tableau($tableauObjets))
						Si (OB_Lire_texte ($tableauObjets{$o};$attribut_cible)=$valeur_cible)
							$indice:=$o
							$o:=MAXENT
						Fin de si 
					Fin de boucle 
					
				Sinon 
					
					$indice:=0
				Fin de si 
				
			: ($item="F")  // First = premier élément du tableau
				$indice:=1
				
			: ($item="L")  // Last = dernier élément du tableau
				$indice:=Taille tableau($tableauObjets)
				
			Sinon 
				$indice:=Num($item)  // numéro dans le tableau
		Fin de cas 
		
		$path:=Sous chaîne($path;$posPoint+1)
		
		Si ($indice>=1) & ($indice<=Taille tableau($tableauObjets))
			$objet:=$tableauObjets{$indice}
		Sinon 
			EFFACER VARIABLE($objet)
		Fin de si 
		
	: ($posPoint>0)
		
		$attribut:=Sous chaîne($path;1;$posPoint-1)
		$path:=Sous chaîne($path;$posPoint+1)
		$last_type:=OB Lire type($objet;$attribut)
		
		Au cas ou 
			: ($last_type=Est un objet)
				$objet:=OB Lire($objet;$attribut;Est un objet)
				
			: ($last_type=Est un tableau objet)
				TABLEAU OBJET($tableauObjets;0)
				OB LIRE TABLEAU($objet;$attribut;$tableauObjets)
		Fin de cas 
		
Fin de cas 

Fin tant que

$posCrochet:=Position("[";$path)

Si ($posCrochet=0)

$resultat:=OB Lire($objet;$path;Est un texte)

Sinon // tableau

$attribut:=Sous chaîne($path;1;$posCrochet-1)
TABLEAU TEXTE($lesAttributs;0)
OB LIRE TABLEAU($objet;$attribut;$lesAttributs)
$item:=Sous chaîne($path;$posCrochet+1;Longueur($path)-$posCrochet-1)

Au cas ou 
	: ($item="F")
		$indice:=1
		
	: ($item="L")
		$indice:=Taille tableau($lesAttributs)
		
	Sinon 
		$indice:=Num($item)  // json commence la numérotation à 0
Fin de cas 

Si ($indice>=1) & ($indice<=Taille tableau($lesAttributs))
	$resultat:=$lesAttributs{$indice}
Sinon 
	$resultat:=""
Fin de si 

Fin de si

$0:=$resultat

</code 4D>

D’accord. Merci à tous pour vos réponses, j’essaye ça la semaine prochaine :slight_smile:

Merci pour vos aides, j’ai réussi à obtenir ce que je voulais.

Si par hasard, quelqu’un voit une amélioration de code, je suis preneur :slight_smile:

<code 4D>
C_OBJECT($value;$oDistance)
ARRAY OBJECT($to_routes;0)
ARRAY OBJECT($to_legs;0)

//contenu du tableau “routes”
$fichierJSON:=WA Get page content(ZW_map)
$value:=JSON Parse($fichierJSON)
OB GET ARRAY($value;“routes”;$to_routes)

//contenu du tableau “legs”
$fichierJSON:=JSON Stringify($to_routes{1})
$value:=JSON Parse($fichierJSON)
OB GET ARRAY($value;“legs”;$to_legs)

//lecture des propriétés de l’objet “distance” et on récupère le texte.
$fichierJSON:=JSON Stringify($to_legs{1})
$value:=JSON Parse($fichierJSON)
$oDistance:=OB GET ($value;“distance”)
vDistanceItineraire:=OB Get($oDistance;“text”)

</code 4D>