1
votes

Excel VBA crée une charge utile json

J'utilise Excel VBA et j'appelle une API de repos externe. L'appel a besoin d'une charge utile au format json. Je suis confronté à un problème en créant le format json.

Sub UploadOfflineInteraction()

    Dim apiName As String
    Dim apiName_value As String
    Dim baseTouchpoint As String
    Dim propositionCode As String
    Dim activityTypeCode As String
    Dim timestamp As String
    Dim NoOfRows As Integer
    Dim i As Integer


    ActiveWorkbook.Worksheets("Data").Activate
    NoOfRows = ActiveWorkbook.Worksheets("Data").Range("A2").End(xlDown).row

    For i = 1 To NoOfRows
        apiName = ActiveWorkbook.Worksheets("Data").Cells(i, 1).Value
        apiName_value = ActiveWorkbook.Worksheets("Data").Cells(i, 2).Value
        baseTouchpoint = ActiveWorkbook.Worksheets("Data").Cells(i, 3).Value
        propositionCode = ActiveWorkbook.Worksheets("Data").Cells(i, 4).Value
        activityTypeCode = ActiveWorkbook.Worksheets("Data").Cells(i, 5).Value
        timestamp = ActiveWorkbook.Worksheets("Data").Cells(i, 6).Value
        Dim tid
        tid = SentOfflineInteraction(apiName, apiName_value, baseTouchpoint, propositionCode, activityTypeCode, timestamp)
    Next i

End Sub

Function SentOfflineInteraction(apiName As String, apiName_value As String, _
              baseTouchpoint As String, propositionCode As String, _
              activityTypeCode As String, timestamp As String) As String

    Dim c As Collection
    Dim d As Dictionary
    Dim e As Dictionary
    Dim f As Dictionary
    Dim json As String

    Set c = New Collection
    Set d = New Dictionary
    Set e = New Dictionary
    Set f = New Dictionary

    d.Add "propositionCode", propositionCode
    d.Add "activityTypeCode", activityTypeCode
    d.Add "timestamp", timestamp
    c.Add d
    f.Add "activities", c

    Dim c1 As Collection
    Dim d1 As Dictionary
    Dim e1 As Dictionary
    Dim f1 As Dictionary

    Set c1 = New Collection
    Set d1 = New Dictionary
    Set e1 = New Dictionary
    Set f1 = New Dictionary

    d1.Add "apiName", apiName
    d1.Add "value", apiName_value
    c1.Add d1
    f1.Add "identifiers", c1

    Dim c2 As Collection
    Dim d2 As Dictionary
    Dim e2 As Dictionary
    Dim f2 As Dictionary

    Set c2 = New Collection
    Set d2 = New Dictionary
    Set e2 = New Dictionary
    Set f2 = New Dictionary

    d2.Add f1
    d2.Add "baseTouchpointUri", baseTouchpoint
    c2.Add d2
    f2.Add "customerContext", c2


    Dim c3 As Collection
    Dim d3 As Dictionary
    Dim e3 As Dictionary
    Dim f3 As Dictionary

    Set c3 = New Collection
    Set d3 = New Dictionary
    Set e3 = New Dictionary
    Set f3 = New Dictionary

    d3.Add f2
    d3.Add f1
    c3.Add d3

    json = JsonConverter.ConvertToJson(ByVal c3)

    Debug.Print json

End Function

Le code vba est le suivant:

{
   "customerContext": {
      "identifiers": [
         {
            "apiName": "email",
            "value": "dautpure@yahoo.com"
         }
      ],
      "baseTouchpointUri": "physical://webinar"
   },
   "activities": [
      {
         "propositionCode": "Homepage",
         "activityTypeCode": "ATTEND_ROADSHOW",
         "timestamp": "2019-12-27T10:31:40Z"
      }
   ]
}

Le problème auquel je suis confronté est de savoir comment créer cette charge utile json. la structure ci-dessous échoue à d2.Add f1

pourriez-vous me dire comment construire ce json


1 commentaires

Comment échoue-t-il exactement?


3 Réponses :


0
votes

Vous avez un problème structurel en ce que chaque fois que vous appelez votre sous pour créer le JSON, les valeurs précédentes sont écrasées. Cependant, l'exemple ci-dessous devrait aider à dissiper la confusion que vous avez lors de la création de la structure JSON de base. Je recommande fortement d'utiliser des noms de variables plus descriptifs (comme dans l'exemple) pour créer moins de confusion.

Cet exemple de code créera un bloc correctement formaté, mais comme je l'ai mentionné, vous devrez retravailler votre logique pour vous assurer toutes les lignes sont correctement ajoutées.

Function SentOfflineInteraction(ByVal apiName As String, _
                                ByVal apiName_value As String, _
                                ByVal baseTouchpoint As String, _
                                ByVal propositionCode As String, _
                                ByVal activityTypeCode As String, _
                                ByVal timestamp As String) As String

    Dim identDetails As Dictionary
    Set identDetails = New Dictionary
    With identDetails
        .Add "apiName", apiName
        .Add "value", apiName_value
    End With

    Dim identifiers As Collection
    Set identifiers = New Collection
    identifiers.Add identDetails

    Dim custContext As Dictionary
    Set custContext = New Dictionary
    With custContext
        .Add "identifiers", identDetails
        .Add "baseTouchpointUri", baseTouchpoint
    End With

    Dim activities As Collection
    Set activities = New Collection

    Dim activityDetails As Dictionary
    Set activityDetails = New Dictionary
    With activityDetails
        .Add "propositionCode", propositionCode
        .Add "activityTypeCode", activityTypeCode
        .Add "timestamp", timestamp
    End With
    activities.Add activityDetails

    Dim root As Dictionary
    Set root = New Dictionary
    With root
        .Add "customerContext", custContext
        .Add "activities", activities
    End With

    CreateJSONBlock = JsonConverter.ConvertToJson(root)
End Function


0 commentaires

0
votes

Utilisation de quelques fonctions d'aide pour simplifier la construction:

Sub UploadOfflineInteraction()

    Dim i As Long, cntxt As Object, act As Object, o As Object

    With ActiveWorkbook.Worksheets("Data")
        For i = 1 To .Cells(.rows.Count, 1).End(xlUp).Row
            With .rows(i)
                Set cntxt = jsonobject("identifiers", _
                                       jsonarray(jsonobject("apiName", .Cells(1).Value, _
                                                            "value", .Cells(2).Value)), _
                                       "baseTouchpointUri", .Cells(3).Value)

                Set act = jsonarray(jsonobject("propositionCode", .Cells(4).Value, _
                                               "activityTypeCode", .Cells(5).Value, _
                                               "timestamp", .Cells(6).Value))


                Set o = jsonobject("customerContext", cntxt, "activities", act)

                Debug.Print JsonConverter.ConvertToJson(o, 2)

            End With
        Next i
    End With

End Sub


'return a dictionary given a paramarray of key_1,value_1,...,key_n,value_n
Function jsonobject(ParamArray keyvals()) As Object
    Dim rv As Object, n As Long
    Set rv = CreateObject("scripting.dictionary")
    For n = LBound(keyvals) To UBound(keyvals) Step 2
        rv.Add keyvals(n), keyvals(n + 1)
    Next n
    Set jsonobject = rv
End Function
'return a collection from a paramarray of values
Function jsonarray(ParamArray vals()) As Collection
    Dim rv As New Collection, n As Long
    For n = LBound(vals) To UBound(vals)
        rv.Add vals(n)
    Next n
    Set jsonarray = rv
End Function


0 commentaires

0
votes

Voici un exemple VBA montrant comment convertir des paramètres "plats" en chaîne JSON de charge utile. Importez le module JSON.bas dans le projet VBA pour le traitement JSON. fort>

Option Explicit

' Need to include a reference to "Microsoft Scripting Runtime"

Sub UploadOfflineInteraction()

    With ActiveWorkbook.Worksheets("Data")
        Dim i As Long
        For i = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
            Dim flat As Dictionary
            Set flat = New Dictionary
            With .Cells(i, 1)
                flat("customerContext.identifiers[0].apiName") = .Offset(, 0).Value
                flat("customerContext.identifiers[0].value") = .Offset(, 1).Value
                flat("customerContext.baseTouchpointUri") = .Offset(, 2).Value
                flat("activities[0].propositionCode") = .Offset(, 3).Value
                flat("activities[0].activityTypeCode") = .Offset(, 4).Value
                flat("activities[0].timestamp") = .Offset(, 5).Value
            End With
            Dim params
            Dim success As Boolean
            JSON.Unflatten flat, params, success
            Dim payload As String
            payload = JSON.Serialize(params)
            Debug.Print payload
        Next
    End With

End Sub


0 commentaires