Rechercher un Membre dans un Json depuis un Patch
Publié : jeu. 12/mars/2020 14:52
Voici comment Rechercher un Membre dans un Json depuis un Patch:
Cependant, je suis conscient qu'il y à des choses que ce code ne pourra pas faire...
De toute façon il n'est pas créér pour autre chose que recherche un Membre dans un Json, peut importe le niveau d'encapsulation.
Il ne peut pas rechercher un Membre dans une Liste ni un Tableau ni une Map par exemple !
Mais ça viendra surement !
Code : Tout sélectionner
; Créé par Dieppedalle David le 12/03/2020.
; Corrections fautes d'orthographe par Micoute.
; Liste pour les messages du debogage.
Global NewList JsonLogMessages.s()
; Vérifie que le Patch est correct et existe dans le Json.
Procedure.b CheckJsonPatch(JsonID.i, JsonPatch.s, LogDebugMessage.b = 1)
If IsJSON(JsonID.i)
AdresseMemoireValeurJson.i = JSONValue(JsonID.i)
If AdresseMemoireValeurJson.i <> 0
If Mid(JsonPatch.s, 1, 1) = "\"
If LogDebugMessage.b = 1
AddElement(JsonLogMessages.s())
JsonLogMessages.s() = "CheckJsonPatch: Echec - Le Patch ne peut pas commencer par un '\' !"
EndIf
ProcedureReturn 0
ElseIf FindString(JsonPatch.s, "\\")
If LogDebugMessage.b = 1
AddElement(JsonLogMessages.s())
JsonLogMessages.s() = "CheckJsonPatch: Echec - Le Patch ne peut pas contenir de double '\' !"
EndIf
ProcedureReturn 0
ElseIf Mid(JsonPatch.s, Len(JsonPatch.s), 1) = "\"
If LogDebugMessage.b = 1
AddElement(JsonLogMessages.s())
JsonLogMessages.s() = "CheckJsonPatch: Echec - Le Patch ne peut pas se terminer par un '\' !"
EndIf
ProcedureReturn 0
ElseIf FindString(JsonPatch.s, Chr(34)) Or FindString(JsonPatch.s, "/") Or FindString(JsonPatch.s, ":") Or FindString(JsonPatch.s, "*") Or
FindString(JsonPatch.s, "?") Or FindString(JsonPatch.s, "<") Or FindString(JsonPatch.s, ">") Or FindString(JsonPatch.s, "|")
If LogDebugMessage.b = 1
AddElement(JsonLogMessages.s())
JsonLogMessages.s() = "CheckJsonPatch: Echec - Le Patch ne peut pas contenir les caractères suivant '/:*?" + Chr(34) + "<>|' !"
EndIf
ProcedureReturn 0
ElseIf JsonPatch.s = ""
If LogDebugMessage.b = 1
AddElement(JsonLogMessages.s())
JsonLogMessages.s() = "CheckJsonPatch: Echec - Le Patch ne peut pas être vide !"
EndIf
ProcedureReturn 0
EndIf
NombreSlash.i = CountString(JsonPatch.s, "\")
If NombreSlash.i = 0
MembreName.s = StringField(JsonPatch.s, 1, "\")
Trouver.b = 0
If JSONType(AdresseMemoireValeurJson.i) = 5
If ExamineJSONMembers(AdresseMemoireValeurJson.i)
While NextJSONMember(AdresseMemoireValeurJson.i)
If JSONMemberKey(AdresseMemoireValeurJson.i) = MembreName.s
AdresseMemoireValeurJson.i = JSONMemberValue(AdresseMemoireValeurJson.i)
Trouver.b = 1
Break
EndIf
Wend
EndIf
If Trouver.b = 0
If LogDebugMessage.b = 1
AddElement(JsonLogMessages.s())
JsonLogMessages.s() = "CheckJsonPatch: Echec - Le Membre '" + MembreName.s + "' est introuvable dans le Json !"
EndIf
ProcedureReturn 0
EndIf
If LogDebugMessage.b = 1
AddElement(JsonLogMessages.s())
JsonLogMessages.s() = "CheckJsonPatch: Succès - Le Membre '" + JsonPatch.s + "' existe bien dans le Json !"
EndIf
ProcedureReturn 1
Else
If LogDebugMessage.b = 1
AddElement(JsonLogMessages.s())
JsonLogMessages.s() = "CheckJsonPatch: Echec - Le Json '" + Str(JsonID.i) + "' n'as pas de Membres !"
EndIf
ProcedureReturn 0
EndIf
ElseIf NombreSlash.i > 0
If JSONType(AdresseMemoireValeurJson.i) = 5
For Index.i = 0 To NombreSlash.i
MembreName.s = StringField(JsonPatch.s, Index.i + 1, "\")
Trouver.b = 0
If ExamineJSONMembers(AdresseMemoireValeurJson.i)
While NextJSONMember(AdresseMemoireValeurJson.i)
If JSONMemberKey(AdresseMemoireValeurJson.i) = MembreName.s
AdresseMemoireValeurJson.i = JSONMemberValue(AdresseMemoireValeurJson.i)
Trouver.b = 1
Break
EndIf
Wend
EndIf
If Trouver.b = 0
If LogDebugMessage.b = 1
AddElement(JsonLogMessages.s())
JsonLogMessages.s() = "CheckJsonPatch: Echec - Le Membre '" + MembreName.s + "' est introuvable dans le Json !"
EndIf
ProcedureReturn 0
EndIf
Next
If LogDebugMessage.b = 1
AddElement(JsonLogMessages.s())
JsonLogMessages.s() = "CheckJsonPatch: Succès - Le Patch '" + JsonPatch.s + "' existe bien dans le Json !"
EndIf
ProcedureReturn 1
Else
If LogDebugMessage.b = 1
AddElement(JsonLogMessages.s())
JsonLogMessages.s() = "CheckJsonPatch: Echec - Le Json '" + Str(JsonID.i) + "' n'as pas de Membres !"
EndIf
ProcedureReturn 0
EndIf
EndIf
Else
If LogDebugMessage.b = 1
AddElement(JsonLogMessages.s())
JsonLogMessages.s() = "CheckJsonPatch: Echec - Le Json '" + Str(JsonID.i) + "' à retourné une erreur de mémoire !"
EndIf
ProcedureReturn 0
EndIf
Else
If LogDebugMessage.b = 1
AddElement(JsonLogMessages.s())
JsonLogMessages.s() = "CheckJsonPatch: Echec - Le Json '" + Str(JsonID.i) + "' n'est pas initialisé !"
EndIf
ProcedureReturn 0
EndIf
EndProcedure
; Affiche la liste de message du debogueur.
Procedure DebugJsonMessages(DebugMessagesID.i = -1)
If DebugMessagesID.i = -1
ForEach JsonLogMessages.s()
Debug JsonLogMessages.s()
Next
ElseIf DebugMessagesID.i > 0
SelectElement(JsonLogMessages.s(), DebugMessagesID.i - 1)
Debug JsonLogMessages.s()
EndIf
EndProcedure
; Efface la liste de message du debogueur.
Procedure ClearJsonDebugMessages()
ClearList(JsonLogMessages.s())
EndProcedure
; Exemples -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
; Création du Json pour l'exemple:
If CreateJSON(0)
AdresseMyJson.i = SetJSONObject(JSONValue(0))
Famille.i = AddJSONMember(AdresseMyJson.i, "Famille")
FamilleObjet.i = SetJSONObject(Famille.i)
Membres.i = AddJSONMember(FamilleObjet.i, "Membres")
MembresObjet.i = SetJSONObject(Membres.i)
Parents.i = AddJSONMember(MembresObjet.i, "Parents")
ParentsObjet.i = SetJSONObject(Parents.i)
Papa.i = AddJSONMember(ParentsObjet.i, "Luck")
Maman.i = AddJSONMember(ParentsObjet.i, "Alice")
Enfants.i = AddJSONMember(MembresObjet.i, "Enfants")
MembresLiens.i = AddJSONMember(FamilleObjet.i, "Liens")
MembresLiensObjet.i = SetJSONObject(MembresLiens.i)
LiensLuckAlice.i = AddJSONMember(MembresLiensObjet.i, "Luck > Alice")
ValeurLiensLuckAlice.i = SetJSONInteger(LiensLuckAlice.i, 88)
LiensAliceLuck.i = AddJSONMember(MembresLiensObjet.i, "Alice > Luck")
ValeurLiensAliceLuck.i = SetJSONInteger(LiensAliceLuck.i, 85)
Maison.i = AddJSONMember(AdresseMyJson.i, "Maison")
Jardin.i = AddJSONMember(AdresseMyJson.i, "Jardin")
Debug ComposeJSON(0, #PB_JSON_PrettyPrint)
EndIf
Debug "----------------------------------------------"
; Test le Json:
Patch.s = ""
MyJsonID.i = 0
CheckJsonPatch(MyJsonID.i, Patch.s)
DebugJsonMessages()
ClearJsonDebugMessages()
Patch.s = "\Famille\Membres\Parents\Luck"
MyJsonID.i = 0
CheckJsonPatch(MyJsonID.i, Patch.s)
DebugJsonMessages()
ClearJsonDebugMessages()
Patch.s = "Famille\Membres\Parents\Lucki\"
MyJsonID.i = 0
CheckJsonPatch(MyJsonID.i, Patch.s)
DebugJsonMessages()
ClearJsonDebugMessages()
Patch.s = "Famille\Membres\\Animal\Chat\Titi"
MyJsonID.i = 0
CheckJsonPatch(MyJsonID.i, Patch.s)
DebugJsonMessages()
ClearJsonDebugMessages()
Patch.s = "Famille\Membres\Parents\Luck"
MyJsonID.i = 0
CheckJsonPatch(MyJsonID.i, Patch.s)
DebugJsonMessages()
ClearJsonDebugMessages()
Patch.s = "Famille\Membres\Parents\Luck"
MyJsonID.i = 1
CheckJsonPatch(MyJsonID.i, Patch.s)
DebugJsonMessages()
ClearJsonDebugMessages()
Patch.s = "Famille\Membres\Parents\Lucki"
MyJsonID.i = 0
CheckJsonPatch(MyJsonID.i, Patch.s)
DebugJsonMessages()
ClearJsonDebugMessages()
Patch.s = "Famille\Membres\Animal\Chat\Titi"
MyJsonID.i = 0
CheckJsonPatch(MyJsonID.i, Patch.s)
DebugJsonMessages()
ClearJsonDebugMessages()
Patch.s = "Famille"
MyJsonID.i = 0
CheckJsonPatch(MyJsonID.i, Patch.s)
DebugJsonMessages()
ClearJsonDebugMessages()
Patch.s = "Membres"
MyJsonID.i = 0
CheckJsonPatch(MyJsonID.i, Patch.s)
DebugJsonMessages()
ClearJsonDebugMessages()
Patch.s = "Maison"
MyJsonID.i = 0
CheckJsonPatch(MyJsonID.i, Patch.s)
DebugJsonMessages()
ClearJsonDebugMessages()
Patch.s = "Jardin"
MyJsonID.i = 0
CheckJsonPatch(MyJsonID.i, Patch.s)
DebugJsonMessages()
ClearJsonDebugMessages()
De toute façon il n'est pas créér pour autre chose que recherche un Membre dans un Json, peut importe le niveau d'encapsulation.
Il ne peut pas rechercher un Membre dans une Liste ni un Tableau ni une Map par exemple !
Mais ça viendra surement !