PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Création d'un JSON récursif a partir d'un tableau
Création d'un JSON récursif a partir d'un tableau
Débuté par Christian, 14 nov. 2023 19:42 - 1 réponse
Membre enregistré
13 messages
Posté le 14 novembre 2023 - 19:42
Bonjour,
J'essaie de créer un JSON récursif a partir d'un tableau qui contient mes données. Les données ont un lien parent-enfant...

C'est la récursivité qui pose problème, je ne suis arrivé qu'à faire mon JSON mais chaque élément est repris dans le JSON comme étant l'enfant du précédent... Or ce n'est pas la structure de mon tableau..

Mon tableau (simplifié ici au maximum)




Et le résultat que je souhaite obtenir
{
"Libelle": "Famille",
"Type": "R",
"Enfants": [
{
"Libelle": "Membre1",
"Type": "M",
"Enfants": [
{
"Libelle": "Enfant1",
"Type": "M",
"Enfants": [
{
"Libelle": "PetitEnfant1",
"Type": "M"
}
]
}
]
},
{
"Libelle": "Membre2",
"Type": "M"
},
{
"Libelle": "Membre3",
"Type": "M",
"Enfants": [
{
"Libelle": "Enfant2",
"Type": "M"
},
{
"Libelle": "Enfant3",
"Type": "M",
"Enfants": [
{
"Libelle": "PetitEnfant1",
"Type": "M"
}
]
}
]
}
]
}
Membre enregistré
4 334 messages
Posté le 15 novembre 2023 - 16:14
Bonjour,
Pour régler un problème de récursivité, il faut utiliser une fonction récursive (étonnant non ?)
L'extrait de MLD qui correspond aux infos que tu nous donnes ressemble à ça :




On en déduit la classe correspondante
CMembre est une Classe <MAPPING=Membre>
m_pkMembre est un entier sur 8 octets ,mapping=PK_Membre,Sérialise="IDMembre"
m_saType est une chaîne ,mapping=NDX_Type,Sérialise="Type"
m_saLibellé est une chaîne ,mapping=Libellé,Sérialise="Libellé"
m_pkParents est entier sur 8,mapping=FK_Parent,Sérialise="Parent"
m_tabEnfants est un tableau de CMembre
FIN

La difficulté est de remplir m_tabEnfants qui va avoir des m_tabEnfants.m_tabEnfants etc
C'est là que va intervenir la méthode récursive.

Les enfant peuvent être obtenus grâce à la requête suivante :
SELECT
Membre.PK_Membre AS PK_Membre,
Membre.NDX_Type AS NDX_Type,
Membre.Libellé AS Libellé,
Membre.FK_Parent AS FK_Parent
FROM
Membre
WHERE
Membre.FK_Parent = {pParent}


La méthode (récursive) ListerEnfant de la classe CMembre devient donc :
Procedure ListerEnfants()
clEnfant est CMembre

REQ_Enfants.pParent=:m_pkMembre
HExécuteRequête(REQ_Enfants)
SI HNbEnr(REQ_Enfants) ALORS
FichierVersTableau(:m_tabEnfants,REQ_Enfants)

POUR TOUT clEnfant de :m_tabEnfants
clEnfant:ListerEnfants()
FIN
FIN


Grâce à cela, on va pouvoir remplir un tableau de membres, pour obtenir le JSON, il suffira de sérialiser.

tabMaFamille est tableau de CMembre
clUnMembre est CMembre
bufJSON est Buffer

FichierVersTableau(tabMaFamille,Membre)

//On remplit les enfants
POUR TOUT clUnMembre de tabMaFamille
clUnMembre:ListerEnfants()
FIN

//On crée le JSON (bufJSON)
Sérialise(tabMaFamille,bufJSON,psdJSON)


--
Il y a peut être plus simple, mais, ça tourne