IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Discussion :

[JSON] Dyctionary et Collection


Sujet :

VBA

  1. #1
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut [JSON] Dyctionary et Collection
    Bonjour,

    Je fais appel à une API REST dans une application ACCESS selon le tutoriel https://blog.goovy.io/api-rest-json-depuis-excel/
    Pour cela, j'utilise les macro de vba-web http://vba-tools.github.io/VBA-Web/


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    Public Sub Interrogation()
     
        Dim client As New WebClient
        Dim Request As New WebRequest
        Dim Response As New WebResponse
        Dim Body As New Dictionary
        Dim Auth As New HttpBasicAuthenticator
        Dim sUsername As String
        Dim sPassword As String
        Dim sUrl As String
        Dim responseData As Dictionary
        Dim sBody As String
     
        EnableLogging = True
     
        sUrl = "XXXXXXXXXXXXXXX"
        sUsername = "XXXXX"
        sPassword = "X"
     
        Auth.Setup sUsername, sPassword
        Set client.Authenticator = Auth
        client.BaseUrl = sUrl
     
        Request.Method = WebMethod.HttpPost
        Request.RequestFormat = WebFormat.Json
        Request.ResponseFormat = WebFormat.Json
     
        'Les paramètres doivent être sous forme de liste []
        Body.Add "statut", Array("VAL")
        Set Request.Body = Body
     
        Set Response = client.Execute(Request)
     
        If (Response.StatusCode = Ok) Then
            Debug.Print "Success! "
            Set responseData = Response.Data
            ProcessResponse responseData
        Else
            Debug.Print "Failure: " & Response.Content
        End If
     
    End Sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    Private Sub ProcessResponse(dict As Dictionary)
        Dim Elem As Variant
        Dim Cle As Variant
     
        Debug.Print "Nombre d'élément " & dict("totalElements")
     
     
        For Each Cle In dict.Keys:
            Debug.Print "valeur de la clé : "; Cle:
        Next Cle
     
        For Each Elem In dict.Items:
            On Error Resume Next
            Debug.Print "valeur de l'item : "; Elem:
        Next Elem
     
    End Sub


    La réponse JSON
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    {
        "content":[],
        "pageable":{"sort":{"sorted":false,"unsorted":true},"pageSize":200,"pageNumber":1,"offset":200,"paged":true,"unpaged":false},
        "warnings":[],
        "totalPages":1,
        "totalElements":22,
        "first":false,
        "sort":{"sorted":false,"unsorted":true},
        "last":true,"number":1,
        "numberOfElements":0,
        "size":200
    }

    J'ai l'erreur suivante "Erreur d'exécution 450 - Nombre d'arguments incorrect ou affectation de propriété incorrecte"
    Cette erreur est levée uniquement sur les Items de type Array

    • "content"
    • "pageable"
    • "warnings"
    • "sort"


    Avez-vous une idée pour éviter ce type d'erreur sachant que dans le champ "content" la réponse JSON finale retournera plusieurs éléments ( dont encore des array) ?
    Je sais qu'il faut mixer les solution avec des Dictionary et des Collections mais je n'arrive pas à l'implémenter


    JSON final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    {
        "content": [
            {
                "id": "0bfc87c2-ea21-4332-b84a-4106c0b25344",
                "score": "107.82179",
                "format": "PDF",
                "titre": "test",
                "indice": "1",
                "dateInsertion": "04/02/2022 10:53:58",
                "dateModif": "08/02/2022 17:38:59",
                "nature": null,
                "version": "5",
                "validite": [
                    "04/02/2021;"
                ],
                "minValidite": "04/02/2021",
                "maxValidite": null,
                "ouvrage": [
                    {
                        "cur": "A7C5C096E043A3681CAEC096",
                        "type": "xx",
                        "niveauHierarchique": null
                    }
                ],
                "maille": [
                    {
                        "cur": "768059E4704BAF4ED5F9DED991B/E346648D31114803BFB4AA2FC06B92EE",
                        "type": null,
                        "niveauHierarchique": null
                    }
                ],
                "statut": "VAL",
                "statutLibelle": "Valide",
                "etat": "VIG",
                "typeDoc": "ddd",
                "typeDocLibelle": "sfsffdfsfsfsdfs",
                "typOuvrage": [
                    "xxxxxx"
                ],
                "entEqp": [],
                "opeMaint": [],
                "docLies": [],
                "proprio": null,
                "saisieLibre": [
                    "refEquipementTest",
                    "test2"
                ],
                "identifiantGed": null,
                "dateRetention": null,
                "renditionPdf": true,
                "lastVersion": true
            },
            {
                "id": "0c6f2a03-b0db-45ac-834f-cfa03bb9350a",
                "score": "107.82179",
                "format": "PDF",
                "titre": "RUF - PDJ  - 3AP1 FG 72,5      - Ph : 3 - 31/01/2022",
                "indice": "1",
                "dateInsertion": "10/02/2022 09:20:41",
                "dateModif": "10/02/2022 09:20:41",
                "nature": null,
                "version": "1",
                "validite": [
                    "10/02/2022;"
                ],
                "minValidite": "10/02/2022",
                "maxValidite": null,
                "ouvrage": [
                    {
                        "cur": "90F991C5CCF024E043A3681CAEF024",
                        "type": "ttt",
                        "niveauHierarchique": null
                    }
                ],
                "maille": [
                    {
                        "cur": "8D31114803BFB4AA2FC06B92EE",
                        "type": null,
                        "niveauHierarchique": null
                    }
                ],
                "statut": "VAL",
                "statutLibelle": "Valide",
                "etat": "VIG",
                "typeDoc": "xx",
                "typeDocLibelle": "fsfsdsdfsdfsdf",
                "typOuvrage": [
                    "xxxxxxxx"
                ],
                "entEqp": [],
                "opeMaint": [],
                "docLies": [],
                "proprio": null,
                "saisieLibre": [
                    "5002258713"
                ],
                "identifiantGed": null,
                "dateRetention": null,
                "renditionPdf": true,
                "lastVersion": true
            }
     
        ],
        "pageable": {
            "sort": {
                "sorted": false,
                "unsorted": true
            },
            "pageSize": 200,
            "pageNumber": 0,
            "offset": 0,
            "paged": true,
            "unpaged": false
        },
        "warnings": [],
        "totalPages": 1,
        "totalElements": 21,
        "first": true,
        "sort": {
            "sorted": false,
            "unsorted": true
        },
        "last": true,
        "number": 0,
        "numberOfElements": 21,
        "size": 200
    }
    D'avance merci beaucoup pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 430
    Points : 20 014
    Points
    20 014
    Billets dans le blog
    67
    Par défaut
    Bonsoir,

    Je ne sais pas si le sujet est toujours d'actualité, mais je remarque que quand vous bouclez sur les éléments du dictionnaire, vous utilisez un On Error Resume Next:

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      For Each Elem In dict.Items:
            On Error Resume Next
            Debug.Print "valeur de l'item : "; Elem:
        Next Elem

    Ne pourriez-vous à la place tester s'il s'agit d'un type objet (collection ou dictionary) avant le debug.print :

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      For Each Elem In dict.Items:
            if (TypeName(Elem) <> "Collection") and (TypeName(Elem) <> "Dictionary") then ' si l'élément est différent d'une collection ou d'un dictionnaire
                Debug.Print "valeur de l'item : " & Elem ' c'est donc une valeur
            end if
        Next Elem

  3. #3
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Bonjour,

    Oui le sujet est toujours d'actualité

    Merci pour le bout de code. effectivement c'est plus propre que le On Error Resume Next.
    je vais tester

    merci pour ton aide

  4. #4
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Bonjour,

    Je confirme que c'est plus pro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Private Sub ProcessResponseDebug(dict As Dictionary)
        Dim Elem As Variant
        Dim Cle As Variant
     
        Debug.Print "Nombre d'élément " & dict("totalElements")
     
     
        For Each Cle In dict.Keys:
            Debug.Print "valeur de la clé : "; Cle:
        Next Cle
     
        For Each Elem In dict.Items:
            If (TypeName(Elem) <> "Collection") And (TypeName(Elem) <> "Dictionary") Then ' si l'élément est différent d'une collection ou d'un dictionnaire
                Debug.Print "valeur de l'item : " & Elem ' c'est donc une valeur
            ElseIf (TypeName(Elem) = "Collection") Then
                Debug.Print "c'est une collection"
            ElseIf (TypeName(Elem) = "Dictionary") Then
                Debug.Print "c'est un dictionnary"
            End If
        Next Elem
     
    End Sub
    Je sais maintenant déterminer le type d'item mais je n'arrive pas à voir comment extraire les données sachant que mon item "content" contient lui même plusieurs Collection ou Dictionnary....
    Avez-vous une idée pour parser la réponse JSON notamment l'item "content" ?

    Bien cordialement

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 129
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Salut.

    Je ne connais pas cette librairie, j'ai créé mon propre objet json pour parser le résultat d'une requête d'une api REST. Mais j'imagine que le fonctionnement est +/- identique côté client.

    Vu qu'un json est en fait une arborescence, l'appel devrait être récursif jusqu'au niveau le plus interne des données. Autrement dit, lorsque tu es en face d'une collection ou d'un dictionnaire, tu en reprends chaque élément et tu testes si c'est une valeur, une collection ou un dictionnaire.

  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 430
    Points : 20 014
    Points
    20 014
    Billets dans le blog
    67
    Par défaut
    Bonjour,

    Citation Envoyé par pingoui Voir le message
    Je sais maintenant déterminer le type d'item mais je n'arrive pas à voir comment extraire les données sachant que mon item "content" contient lui même plusieurs Collection ou Dictionnary....
    Avez-vous une idée pour parser la réponse JSON notamment l'item "content" ?
    Bien cordialement
    Comme expliqué par Pierre, il faut ajouter des appels récursifs dans votre procédure pour explorer les collections ou dictionnaires dans l'arborescence json :

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Private Sub ProcessResponseDebug(element As Variant)
        Dim i As Long, cle As Variant, keys As Variant, item As Variant
     
        If (TypeName(element) = "Dictionary") Then ' si l'élément est un dictionnaire
            Debug.Print "c'est un dictionnary :"
            keys = element.keys
            For i = 0 To element.Count - 1
                cle = keys(i)
                Debug.Print "clé : " & cle
                ProcessResponseDebug element(cle)
            Next i
        Else
            If (TypeName(element) = "Collection") Then  ' si l'élément est une collection 
                Debug.Print "c'est une collection : "
                For Each item In element
                    ProcessResponseDebug item
                Next item
            Else
                Debug.Print "valeur de l'item : " & element ' c'est donc une valeur
            End If
        End If
     
    End Sub

    Ensuite pour appeler la procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Debug.Print "Nombre d'éléments : " & dict("totalElements")
     
    ProcessResponseDebug dict
    bien sûr ça va nécessiter d'adapter le code

    Cdlt.

  7. #7
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Bonjour,

    Merci à vous deux pour votre aide

    Je mets en oeuvre vos conseils ce week-end et je reviens vers vous

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 408
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 408
    Points : 2 050
    Points
    2 050
    Par défaut
    Citation Envoyé par pingoui Voir le message
    Bonjour,

    Pour cela, j'utilise les macro de vba-web http://vba-tools.github.io/VBA-Web/
    Salut,

    Loin de me faire de la pub, mais je déconseille l'utilisation de cette librairie.
    - Elle est bugée.
    - En fait plus que nécessaire.
    - N'est plus maintenue.
    - Faiblement typée.

    Je te propose la librairie suivante qui certes n'est pas terminée (je doit finir la doc), mais est correcte:
    https://github.com/Deedolith/JSON-VBA

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/03/2017, 16h32
  2. JPA entity collection en json
    Par mimi6060 dans le forum JPA
    Réponses: 11
    Dernier message: 30/12/2015, 17h10
  3. [AJAX] Json = une collection de couples
    Par michelp3 dans le forum AJAX
    Réponses: 1
    Dernier message: 15/06/2010, 12h18
  4. JSON et Collection
    Par James- dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/04/2007, 15h01
  5. [VB6] Modifier la clé d'un élément d'une collection
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 15h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo