PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2025 → Fichier CSV vers JSON
Fichier CSV vers JSON
Started by guev, May, 27 2022 2:25 AM - 7 replies
Registered member
80 messages
Posted on May, 27 2022 - 2:25 AM
Bonjour

Je dois transformer un fichier CSV vers un JSON afin d'envoyer ce dernier dans une API pour la mise à jour des données.

La structure du CSV est la suivante :
NoTicket;group;idExternal;date;class10;class2;quantity;class1;finalValue
75883;RYR03;110554607;20/05/2022;58509;20526;1,00;CN4 STYLO WATER 06 TURQUOIS nv;7,42
75884;RYR03;111208633;20/05/2022;40903;;1,00;EVIDENCE DEODORANT;14,74
75884;RYR03;111208633;20/05/2022;40904;;1,00;EVIDENCE DEODORANT 2;14,75
75894;RYR03;111829362;20/05/2022;11594;;1,00;BLOOM EDP 50ML;24,88
75896;RYR03;110099835;20/05/2022;21897;;1,00;OAV OP 05/22 SAC TPS DES CERISE;4,61
75896;RYR03;110099835;20/05/2022;82204;OFFID;1,00;OS21 ORANGE FONDANT GD200;3,23
75906;RYR03;111937140;20/05/2022;64449;;1,00;CNT21 BTE BEIGE PM FEMME;4,15
75908;RYR03;111880563;20/05/2022;94295;;1,00;OS21 EVIDENCE VAPO SAC 10ML;11,53
75909;RYR03;110360021;20/05/2022;36642;20526;1,00;HOGGAR EDT VAPO 50ML nv;19,93
75912;RYR03;111890513;20/05/2022;07792;;1,00;SV PIEDS BAUME REPARATEUR 75ML;14,10


La stucture du JSON doit être la suivante :

"AdEvent":{ 
"type":"addCA", 
"date":2022-05-20 00:00:00.000, 
"idExternal":"111208633", 
"member":{
                 "loadFromKeys":{
                     "idExternal":"111208633"
                 }
          },
"fvalue":29.49, 
"group":"RYR03",
"details":[ 
{ "AdEventDetail":{ "idExternal":"111208633", "detailType":"I", "class1":"EVIDENCE DEODORANT",   "class2":"", "class10":"40903", "quantity":1, "finalValue":14.74 } }, 
{ "AdEventDetail":{ "idExternal":"111208633", "detailType":"I", "class1":"EVIDENCE DEODORANT 2",   "class2":"", "class10":"40904", "quantity":1, "finalValue":14.75 } }, 

}
}


J'ai commencé avec ce code mais il y un souci au niveau de la balise "details" car je n'ai pas les crochets.

vConstReq est un Variant
sJsonData est une chaîne

vConstReq.AdEvent.type = "addCA"
vConstReq.AdEvent.date = TempTickets.DateTicket
vConstReq.AdEvent.idExternal = TempTickets.Tiers
vConstReq.AdEvent.member.loadFromkeys.idExternal = TempTickets.Tiers
vConstReq.AdEvent.fvalue = REQ_SommeTicket.la_somme_TotalHT
vConstReq.AdEvent.group = TempTickets.Etablissement
vConstReq.details.AdEventDetail.idExternal = TempTickets.Tiers


sJsonData = "&json_data=" + Remplace(VariantVersJSON(vConstReq, psdMinifié), Caract(34), "'")


Si quelqu'un peut me donner un coup de main je serais ravi.
Merci à tous.

--
Hervé
Registered member
92 messages
Posted on May, 27 2022 - 3:42 AM
Salut

Il faut remplir une variable tableau avant et faire vConstReq.AdEvent.details = nomDuTableau

--
Bon dev.

Patrick Lalemand
https://www.lapalys.ca
Registered member
80 messages
Posted on May, 27 2022 - 5:39 AM
Bonjour

Merci pour votre aide.

Voici mon code modifié mais il manque les "titres" dans la partie "details" et la balise AdEventDetail pour chaque ticket.

vConstReq.AdEvent.type = "addCA"
vConstReq.AdEvent.date = TempTickets.DateTicket
vConstReq.AdEvent.idExternal = TempTickets.Tiers
vConstReq.AdEvent.member.loadFromkeys.idExternal = TempTickets.Tiers
vConstReq.AdEvent.fvalue = REQ_SommeTicket.la_somme_TotalHT
vConstReq.AdEvent.group = TempTickets.Etablissement
Ajoute(TabDetails,TempTickets.Tiers)
Ajoute(TabDetails,"I")
Ajoute(TabDetails,TempTickets.LibelleArticle)
Ajoute(TabDetails,TempTickets.CodeCondition)
Ajoute(TabDetails,TempTickets.CodeArticle)
Ajoute(TabDetails,TempTickets.Quantite)
Ajoute(TabDetails,TempTickets.TotalHT)
vConstReq.AdEvent.details = TabDetails

sJsonData = "&json_data=" + Remplace(VariantVersJSON(vConstReq, psdMiseEnForme), Caract(34), "'")


Voici le code JSON
&json_data={
'AdEvent':
{
'type':'addCA',
'date':'23\/05\/20',
'idExternal':'243054',
'member':
{
'loadFromkeys':
{
'idExternal':'243054'
}
},
'fvalue':-11.05999994278,
'group':'RYR13',
'details':
[
'243054',
'I',
'CN3 RAL VERTIGE 49 SATINE=====',
'0',
'37022',
'-1',
'-6.45'
]
}
}


Quel code je dois rajouter ?
Merci

--
Hervé
Message modified, May, 27 2022 - 5:53 AM
Registered member
80 messages
Posted on May, 27 2022 - 8:18 AM
J'ai pu avancé sur mon code mais il me manque une dernière chose et j'ai du mal à trouver la solution.

Dans le JSON il y a le tableau "details" avec le noeud "AdEventDetail".
Je ne sais pas comment mettre ce noeud.
Exemple code JSON
{
   "AdEvent":{
          "type":"addCA",
          "date":2022-05-20 00:00:00
          "member":{
                 "loadFromKeys":{
                     "idExternal":"110554607"
                 }
          },
          "fvalue":150,
          "details":[
                 {
                        "AdEventDetail":{
                           "class1":"CN4 STYLO WATER 06 TURQUOIS nv",
                           "class10":"test",
                           "quantity":1,
                           "unitValue":50.0,
                           "finalValue":50.0
                        }
                 },
                 {
                        "AdEventDetail":{
                           "class1":"Article test 2",
                           "class10":"test",
                           "quantity":2,
                           "unitValue":50.0,
                           "finalValue":100.0
                        }
                 }
          ]
   }
}


Voici mon code
cRequete est un HTTPRequête
cReponse est un httpRéponse
vConstReq est un Variant
vConstReqCompl est un Variant
vMonClient est un Variant
sBasiAuth est une chaîne
sJsonHeader est une chaîne
sJsonData est une chaîne
nLignes est un entier
nIndice est un entier

ST_Details est une Structure
ExternalId est une chaîne <Sérialise ="idExternal">
detailType est une chaîne
class1 est une chaîne
class2 est une chaîne
class10 est une chaîne
quantity est une chaîne
finalValue est une chaîne
FIN
tableau de est un tableau de ST_Details

sBasiAuth = "Basic " + Encode(gApiKey + ";" + gUsername + ":" + gPassword, encodeBASE64SansRC)


//Construction de la requete
HExécuteRequête(REQ_SommeTicket)
POUR TOUT REQ_SommeTicket
HLitRecherche(TempTickets, NoTicket, REQ_SommeTicket.NoTicket, hIdentique)

vConstReq.AdEvent.type = "addCA"
vConstReq.AdEvent.date = TempTickets.DateTicket
vConstReq.AdEvent.idExternal = TempTickets.Tiers
vConstReq.AdEvent.member.loadFromkeys.idExternal = TempTickets.Tiers
vConstReq.AdEvent.fvalue = REQ_SommeTicket.la_somme_TotalHT
vConstReq.AdEvent.group = TempTickets.Etablissement

nIndice = TableauAjoute(tabDetails)
tabDetails[nIndice].ExternalId = TempTickets.Tiers
tabDetails[nIndice].detailType = "I"
tabDetails[nIndice].class1 = TempTickets.LibelleArticle
tabDetails[nIndice].class2 = TempTickets.CodeCondition
tabDetails[nIndice].class10 = TempTickets.CodeArticle
tabDetails[nIndice].quantity = TempTickets.Quantite
tabDetails[nIndice].finalValue = TempTickets.TotalHT
vConstReq.details = tabDetails


//sJsonHeader = "json_header="+Remplace(VariantVersJSON(vConstReqCompl, psdMinifié), Caract(34), "'")
sJsonData = "&json_data=" + Remplace(VariantVersJSON(vConstReq, psdMiseEnForme), Caract(34), "'")

//AVEC requete
cRequete..URL = gProtocole + gServeur + gUrlApi + sJsonHeader + sJsonData
cRequete..Méthode = httpPut
cRequete..ContentType = "application/json"
cRequete..Entête["Accept"] = "application/json"
cRequete..Entête["Authorization"] = sBasiAuth
cRequete..IgnoreErreur = httpIgnoreCertificatExpiré + httpIgnoreCertificatInvalide + httpIgnoreNomCertificatInvalide + httpIgnoreRedirection + httpIgnoreRevocation

cReponse = HTTPEnvoie(cRequete)

FIN


Qui a une solution ?
Merci

--
Hervé
Registered member
80 messages
Posted on May, 27 2022 - 10:38 PM
Un peu de changement dans mon code ce qui donne le résultat attendu.
vConstReq.AdEvent.type = "addCA"
vConstReq.AdEvent.date = "2022-05-20"
vConstReq.AdEvent.idExternal = TempTickets.Tiers
vConstReq.AdEvent.member.loadFromkeys.idExternal = TempTickets.Tiers
vConstReq.AdEvent.fvalue = REQ_SommeTicket.la_somme_TotalHT
vConstReq.AdEvent.group = TempTickets.Etablissement

nIndice = TableauAjoute(details)
vConstReq.AdEvent.details[nIndice].AdEventDetail.idExternal = TempTickets.Tiers
vConstReq.AdEvent.details[nIndice].AdEventDetail.detailType = "I"
vConstReq.AdEvent.details[nIndice].AdEventDetail.class1 = TempTickets.LibelleArticle
vConstReq.AdEvent.details[nIndice].AdEventDetail.class2 = TempTickets.CodeCondition
vConstReq.AdEvent.details[nIndice].AdEventDetail.class10 = TempTickets.CodeArticle
vConstReq.AdEvent.details[nIndice].AdEventDetail.quantity = TempTickets.Quantite
vConstReq.AdEvent.details[nIndice].AdEventDetail.finalValue = TempTickets.TotalHT

sJsonData = "json_data=" + VariantVersJSON(vConstReq, psdMiseEnForme)

//AVEC requete
cRequete..URL = gProtocole + gServeur + gUrlApi + sJsonData
cRequete..Méthode = httpPut
cRequete..ContentType = "application/json"
cRequete..Entête["Accept"] = "application/json"
cRequete..Entête["Authorization"] = sBasiAuth
cRequete..IgnoreErreur = httpIgnoreCertificatExpiré + httpIgnoreCertificatInvalide + httpIgnoreNomCertificatInvalide + httpIgnoreRedirection + httpIgnoreRevocation

cReponse = HTTPEnvoie(cRequete)
vMonClient = JSONVersVariant(cReponse.Contenu)


Par contre cela me dit que mon JSON est invalide lorsque je passe sur cRequete..Url.
Je coince sur ce point.

Avez-vous une solution ?

Merci

--
Hervé
Registered member
80 messages
Posted on May, 28 2022 - 12:23 AM
Bonjour

Pour ceux qui peuvent m'aider à régler mon problème voici les infos pour tester l'API.
J'ai mis les infos en dur dans le code, il s'agit de :
sBasiAuth = "Basic " + Encode("KEY-f6fde269-2753-4eba-8bf3-55928432c74a" + ";" + "API_YvesRocher_Gbh" + ":" + "XJcqLM759pd5", encodeBASE64SansRC)


Voici l'url pour tester l'API : https://qa.adelya.com/apiv1/test/api/testBasic.jsp
Vous avez aussi l'accès à la doc.

Si je copie/colle le résultat de ma requête http dans le test la réponse est OK.
cRequete..URL = "https://" + "qa.adelya.com" + "/apiv1/webapi.do?" + sJsonData







Mais la réponse renvoyé par mon code est 400 bad request.
Voici mon code
cRequete est un HTTPRequête
cReponse est un httpRéponse
vConstReq est un Variant
sBasiAuth est une chaîne
sJsonData est une chaîne ANSI
nIndice est un entier


ST_Details est une Structure
idExternal est une chaîne
detailType est une chaîne
class1 est une chaîne
class2 est une chaîne
class10 est une chaîne
quantity est une chaîne
finalValue est une chaîne
FIN
details est un tableau de ST_Details

sBasiAuth = "Basic " + Encode("KEY-f6fde269-2753-4eba-8bf3-55928432c74a" + ";" + "API_YvesRocher_Gbh" + ":" + "XJcqLM759pd5", encodeBASE64SansRC)


//Construction de la requete
HExécuteRequête(REQ_SommeTicket)
POUR TOUT REQ_SommeTicket
HLitRecherche(TempTickets, NoTicket, REQ_SommeTicket.NoTicket, hIdentique)

vConstReq.AdEvent.type = "addCA"
vConstReq.AdEvent.date = "2022-05-20"
vConstReq.AdEvent.idExternal = TempTickets.Tiers
vConstReq.AdEvent.member.loadFromKeys.idExternal = TempTickets.Tiers
vConstReq.AdEvent.fvalue = REQ_SommeTicket.la_somme_TotalHT
//vConstReq.AdEvent.group = TempTickets.Etablissement

nIndice = TableauAjoute(details)
vConstReq.AdEvent.details[nIndice].AdEventDetail.idExternal = TempTickets.Tiers
vConstReq.AdEvent.details[nIndice].AdEventDetail.detailType = "I"
vConstReq.AdEvent.details[nIndice].AdEventDetail.class1 = TempTickets.LibelleArticle
vConstReq.AdEvent.details[nIndice].AdEventDetail.class2 = TempTickets.CodeCondition
vConstReq.AdEvent.details[nIndice].AdEventDetail.class10 = TempTickets.CodeArticle
vConstReq.AdEvent.details[nIndice].AdEventDetail.quantity = TempTickets.Quantite
vConstReq.AdEvent.details[nIndice].AdEventDetail.finalValue = TempTickets.TotalHT


sJsonData = "json_data=" + VariantVersJSON(vConstReq, psdMiseEnForme)

//AVEC requete
cRequete..URL = "https://" + "qa.adelya.com" + "/apiv1/webapi.do?" + sJsonData
cRequete..Méthode = httpPut
cRequete..ContentType = "application/json"
cRequete..Entête["Accept"] = "application/json"
cRequete..Entête["Authorization"] = sBasiAuth
cRequete..IgnoreErreur = httpIgnoreCertificatExpiré + httpIgnoreCertificatInvalide + httpIgnoreNomCertificatInvalide + httpIgnoreRedirection + httpIgnoreRevocation

cReponse = HTTPEnvoie(cRequete)
SI ErreurDétectée ALORS
Erreur(ErreurInfo(errComplet))
SINON
Info(cReponse.Contenu)
FIN
FIN


Code JSON avec les valeurs
{
"AdEvent":
{
"type":"addCA",
"date":"2022-05-20",
"idExternal":"243054",
"member":
{
"loadFromKeys":
{
"idExternal":"243054"
}
},
"fvalue":-11.05999994278,
"details":
[
{
"AdEventDetail":
{
"idExternal":"243054",
"detailType":"I",
"class1":"CN3 RAL VERTIGE 49 SATINE=====",
"class2":0,
"class10":37022,
"quantity":-1,
"finalValue":-6.45
}
}
]
}
}


Je vous remercie pour l'aide que vous pourrez m'apporter.

--
Hervé
Registered member
80 messages
Posted on May, 28 2022 - 2:54 AM
Et bien avec ce code la réponse est ok.
cRequete..URL = URLEncode(gProtocole + gServeur + gUrlApi + "json_data="+Remplace(VariantVersJSON(vConstReq,psdMinifié),Caract(34),"'"),encodeURLDepuisAnsi)


--
Hervé
Posted on August, 18 2022 - 10:20 AM
Un grand merci pour le partage de ta solution qui m'a enlevé une épine du pied.