Rechercher un Membre dans un Json depuis un Patch

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Rechercher un Membre dans un Json depuis un Patch

Message par Shadow »

Voici comment Rechercher un Membre dans un Json depuis un Patch:

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()
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 !
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Naheulf
Messages : 193
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Rechercher un Membre dans un Json depuis un Patch

Message par Naheulf »

Je me permet de me citer : (et puis j'ai les droits d'auteur donc je fait ce que je veut)
Naheulf a écrit :il ne faut pas penser JSON. Le JSON n'est pas une fin mais seulement un outil permettant de représenter textuellement des données déjà structurées. En fait, dans notre cas, il faut penser uniquement en PureBasic
(message original)

Toi t'essaye de faire l'exact opposé : t'essaye de réfléchir pseudo JSON bâtard et d'adapter PureBasic en fonction...
Répondre