[A SUIVRE] JSON avec nom de membre contenant un ":"

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: JSON avec nom de membre contenant un ":"

Message par Ollivier »

Moi, je serais plutôt inquièt, à ta place par le polymorphisme qui se cache derrière l'usage du '@', mais bon (on va forcément y venir à ce problème), regarde ce que donne une map avec InsertJSONStructure...

Code : Tout sélectionner

Structure resultats
 map xxx.s()
EndStructure
...quand tu as...

Code : Tout sélectionner

xxx("yyy:zzz") = "www"

En gros...

Code : Tout sélectionner

JSON TEXTE
{
"pierre": "plombier"
"@paul" {
"metier": "menuisier"
}
}

donne partiellement :

Structure main
 map void.s()
 paul.paul
EndStructure
...et...

Code : Tout sélectionner

JSON TEXTE
{
"pierre": "plombier"
"@paul" {
"metier": "menuisier"
}
"@jacques" {etc...}
}

donne partiellement :

Structure main
 map void.s()
 paul.paul
 jacques.jacques
EndStructure
Voilà, selon la donnée JSON, le code source purebasic conséquent est durement modifié.
La structure "main" est modifiée selon le nombre de termes qui sont préfixés par un "arobase". Ça s'assimile à du polymorphisme.

Donc, il me semble impossible de gérer ça sans commencer par créer un outil (pré-programme écrit en Pb pour convertir du texte au format JSON en texte au format source purebasic dans l'IDE).
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: JSON avec nom de membre contenant un ":"

Message par boddhi »

Merci pour tes efforts, Ollivier, mais je n'ai pas réussi à combiner ton raisonnement et mon objectif en lignes de code.

De guerre lasse, j'ai posté aujourd'hui un thread sur le sujet sur le forum US, avec ma demande initiale, à savoir comment récupérer dans des variables structurées des noms de membres du genre :
"aaaa:bbbb" : "xxxx"
"#cccc" : "yyyy"
"@cccc" : "zzzz"
Ici, la réponse de Fred :
Fred a écrit : mer. 31/mai/2023 13:26 It's not yet possible, but I plan to add an optional parameter to specify a specific mapping (using a Map()) as some fields can't be mapped to native types.
Pour les moins anglophones ou les plus anglophobes d'entre-nous ( :mrgreen: ) :
Ce n'est pas encore possible, mais je prévois d'ajouter un paramètre facultatif pour spécifier une correspondance spécifique (à l'aide d'une Map()), car certains champs ne peuvent pas être mis en correspondance avec des types natifs.
Dans l'attente de la mise à dispo et de l'intérêt d'une telle fonctionnalité, je vais donc devoir passer par la case analyse complète de la structure JSON et traitement des noms de membres... 😢🙂
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: [A SUIVRE] JSON avec nom de membre contenant un ":"

Message par boddhi »

A toutes fins utiles,

En attendant la solution proposée par Fred, j'ai opté pour l'astuce suivante :
1) Utiliser HTTPRequestMemory() au lieu de ReceiveHTTPMemory()
2) Récupérer la réponse à l'aide HTTPInfo(xxxx,#PB_HTTP_Response)
3) Remplacer les noms de membres ne pouvant être affectés correctement
4) Utiliser ParseJSON() au lieu de CatchJSON

En gros :

Code : Tout sélectionner

Structure STRUCTUREVARIABLE
  aaaa_bbbb.s ; A la place de aaaa:bbbb
  Ycccc.s ; A la place de #cccc
  Zdddd.s ; A la place de @dddd
EndStructure

*RetourRequeteHTTP=HTTPRequestMemory(#PB_HTTP_Get,RequeteHTTP)
If *RetourRequeteHTTP
  If HTTPInfo(*RetourRequeteHTTP,#PB_HTTP_StatusCode)="200"
    ReponseRequete=HTTPInfo(*RetourRequeteHTTP,#PB_HTTP_Response)
    ReplaceString(ReponseRequete,"aaaa:bbbb","aaaa_bbbb",#PB_String_InPlace)
    ReplaceString(ReponseRequete,"#cccc","Ycccc",#PB_String_InPlace)
    ReplaceString(ReponseRequete,"@dddd","Zdddd",#PB_String_InPlace)
    IDJSON=ParseJSON(#JSON,ReponseRequete,#PB_JSON_NoCase)
    ExtractJSONStructure(JSONValue(#JSON),@ReponseRequete,STRUCTUREVARIABLE)
  EndIf
EndIf
Répondre