44 votes

Existe-t-il un analyseur JSON pour VB6 / VBA ?

J'essaie de consommer un service web en VB6. Ce service, que je contrôle, peut actuellement renvoyer un message SOAP/XML ou JSON. J'ai beaucoup de mal à déterminer si le type SOAP de VB6 (version 1) peut traiter un message retourné de type object - par opposition à des types simples comme string , int etc. Jusqu'à présent, je n'arrive pas à comprendre ce que je dois faire pour que VB6 joue avec les objets retournés.

J'ai donc pensé que je pourrais sérialiser la réponse dans le service web comme une chaîne JSON. Existe-t-il un analyseur JSON pour VB6 ?

0 votes

J'ai une réponse ci-dessous mais j'ai maintenant trouvé une meilleure méthode. exceldevelopmentplatform.blogspot.com/2018/01/

47voto

Ben McCormack Points 10669

Vérifiez JSON.org pour obtenir une liste actualisée (voir le bas de la page principale) des analyseurs JSON dans de nombreux langages différents. Au moment de la rédaction de cet article, vous y trouverez un lien vers deux analyseurs JSON différents :

  • VB-JSON

    • Quand j'ai essayé de télécharger le fichier zip, Windows a dit que les données étaient corrompues. Cependant, j'ai pu utiliser 7-zip pour sortir les dossiers. Il s'avère que le "dossier" principal du fichier zip n'est pas reconnu comme un dossier par Windows, mais 7-zip peut voir le contenu de ce "dossier" principal, vous pouvez donc l'ouvrir et extraire les fichiers en conséquence.

    • La syntaxe réelle de cette bibliothèque VB JSON est très simple :

      Dim p As Object
      Set p = JSON.parse(strFormattedJSON)
      
      'Print the text of a nested property '
      Debug.Print p.Item("AddressClassification").Item("Description")
      
      'Print the text of a property within an array '
      Debug.Print p.Item("Candidates")(4).Item("ZipCode")
    • Note : J'ai dû ajouter la bibliothèque "Microsoft Scripting Runtime" et "Microsoft ActiveX Data Objects 2.8" comme références via Outils > Références dans l'éditeur VBA.

    • Note : Le code VBJSON est en fait basé sur un projet google code. vba-json . Cependant, VBJSON promet plusieurs corrections de bogues par rapport à la version originale.

  • PW.JSON
    • Il s'agit en fait d'une bibliothèque pour VB.NET alors je n'ai pas passé beaucoup de temps à l'examiner.

0 votes

Y a-t-il un moyen avec VB-JSON de lui passer un objet Class et de retourner la chaîne JSON correspondante ? Merci !

0 votes

Comment faire une boucle à travers les objets ? Disons que p.Item("AddressClassification") contient 3 éléments. Comment puis-je boucler sur les éléments ?

0 votes

@AlexandreH.Tremblay Vous devriez pouvoir parcourir l'élément en boucle comme vous le feriez avec un tableau en VB6/VBA.

15voto

amadeus Points 2299

Je m'appuie sur la solution d'ozmike, qui n'a pas fonctionné pour moi (Excel 2013 et IE10). La raison est que je ne pouvais pas appeler les méthodes sur l'objet JSON exposé. Donc ses méthodes sont maintenant exposées à travers des fonctions attachées à un DOMElement. Je ne savais pas que c'était possible (ce doit être ce truc IDispatch), merci ozmike.

Comme ozmike l'a dit, pas de librairies tierces, juste 30 lignes de code.

Option Explicit

Public JSON As Object
Private ie As Object

Public Sub initJson()
    Dim html As String

    html = "<!DOCTYPE html><head><script>" & _
    "Object.prototype.getItem=function( key ) { return this[key] }; " & _
    "Object.prototype.setItem=function( key, value ) { this[key]=value }; " & _
    "Object.prototype.getKeys=function( dummy ) { keys=[]; for (var key in this) if (typeof(this[key]) !== 'function') keys.push(key); return keys; }; " & _
    "window.onload = function() { " & _
    "document.body.parse = function(json) { return JSON.parse(json); }; " & _
    "document.body.stringify = function(obj, space) { return JSON.stringify(obj, null, space); }" & _
    "}" & _
    "</script></head><html><body id='JSONElem'></body></html>"

    Set ie = CreateObject("InternetExplorer.Application")
    With ie
        .navigate "about:blank"
        Do While .Busy: DoEvents: Loop
        Do While .readyState <> 4: DoEvents: Loop
        .Visible = False
        .document.Write html
        .document.Close
    End With

    ' This is the body element, we call it JSON:)
    Set JSON = ie.document.getElementById("JSONElem")

End Sub

Public Function closeJSON()
    ie.Quit
End Function

Le test suivant construit un objet JavaScript à partir de rien, puis le met en forme. Ensuite, il analyse l'objet en retour et itère sur ses clés.

Sub testJson()
    Call initJson

    Dim jsObj As Object
    Dim jsArray As Object

    Debug.Print "Construction JS object ..."
    Set jsObj = JSON.Parse("{}")
    Call jsObj.setItem("a", 1)
    Set jsArray = JSON.Parse("[]")
    Call jsArray.setItem(0, 13)
    Call jsArray.setItem(1, Math.Sqr(2))
    Call jsArray.setItem(2, 15)
    Call jsObj.setItem("b", jsArray)

    Debug.Print "Object: " & JSON.stringify(jsObj, 4)

    Debug.Print "Parsing JS object ..."
    Set jsObj = JSON.Parse("{""a"":1,""b"":[13,1.4142135623730951,15]}")

    Debug.Print "a: " & jsObj.getItem("a")
    Set jsArray = jsObj.getItem("b")
    Debug.Print "Length of b: " & jsArray.getItem("length")
    Debug.Print "Second element of b: "; jsArray.getItem(1)

    Debug.Print "Iterate over all keys ..."
    Dim keys As Object
    Set keys = jsObj.getKeys("all")

    Dim i As Integer
    For i = 0 To keys.getItem("length") - 1
        Debug.Print keys.getItem(i) & ": " & jsObj.getItem(keys.getItem(i))
    Next i

    Call closeJSON
End Sub

sorties

Construction JS object ...
Object: {
    "a": 1,
    "b": [
        13,
        1.4142135623730951,
        15
    ]
}
Parsing JS object ...
a: 1
Length of b: 3
Second element of b:  1,4142135623731 
Iterate over all keys ...
a: 1
b: 13,1.4142135623730951,15

7voto

dashmug Points 189

Je sais qu'il s'agit d'une vieille question mais j'espère que ma réponse sera d'une grande aide pour les autres personnes qui continuent à venir sur cette page après avoir cherché "vba json".

J'ai trouvé ceci page pour être très utile. Il fournit plusieurs classes VBA compatibles avec Excel qui traitent le traitement des données au format JSON.

0 votes

Laquelle recommanderiez-vous ?

4voto

ozmike Points 583

Voici une bibliothèque VB JSON "native".

Il est possible d'utiliser JSON qui est déjà dans IE8+. Ainsi, vous ne dépendez pas d'une bibliothèque tierce qui n'est plus à jour et qui n'est pas testée.

Sub myJSONtest()

Dim oJson As Object
Set oJson = oIE_JSON() ' See below gets IE.JSON object

' using json objects
Debug.Print oJson.parse("{ ""hello"": ""world"" }").hello ' world
Debug.Print oJson.stringify(oJson.parse("{ ""hello"": ""world"" }")) ' {"hello":"world"}

' getting items
Debug.Print oJson.parse("{ ""key1"": ""value1"" }").key1 ' value1
Debug.Print oJson.parse("{ ""key1"": ""value1"" }").itemGet("key1") ' value1
Debug.Print oJson.parse("[ 1234, 4567]").itemGet(1) '  4567

' change  properties
Dim o As Object
Set o = oJson.parse("{ ""key1"": ""value1"" }")
o.propSetStr "key1", "value\""2"
Debug.Print o.itemGet("key1") ' value\"2
Debug.Print oJson.stringify(o) ' {"key1":"value\\\"2"}
o.propSetNum "key1", 123
Debug.Print o.itemGet("key1") ' 123
Debug.Print oJson.stringify(o) ' {"key1":123}

' add properties
o.propSetNum "newkey", 123 ' addkey! JS MAGIC
Debug.Print o.itemGet("newkey") ' 123
Debug.Print oJson.stringify(o) ' {"key1":123,"newkey":123}

' assign JSON 'objects' to properties
Dim o2 As Object
Set o2 = oJson.parse("{ ""object2"": ""object2value"" }")
o.propSetJSON "newkey", oJson.stringify(o2) ' set object
Debug.Print oJson.stringify(o) ' {"key1":123,"newkey":{"object2":"object2value"}}
Debug.Print o.itemGet("newkey").itemGet("object2") ' object2value

' change array items
Set o = oJson.parse("[ 1234, 4567]") '
Debug.Print oJson.stringify(o) ' [1234,4567]
Debug.Print o.itemGet(1)
o.itemSetStr 1, "234"
Debug.Print o.itemGet(1)
Debug.Print oJson.stringify(o) ' [1234,"234"]
o.itemSetNum 1, 234
Debug.Print o.itemGet(1)
Debug.Print oJson.stringify(o) ' [1234,234]

' add array items
o.itemSetNum 5, 234 ' add items! JS Magic
Debug.Print o.itemGet(5) ' 234
Debug.Print oJson.stringify(o) ' [1234,234,null,null,null,234]

' assign JSON object to array item
o.itemSetJSON 3, oJson.stringify(o2)  ' assign object
Debug.Print o.itemGet(3) '[object Object]
Debug.Print oJson.stringify(o.itemGet(3)) ' {"object2":"object2value"}
Debug.Print oJson.stringify(o) ' [1234,234,null,{"object2":"object2value"},null,234]

oIE_JSON_Quit ' quit IE, must shut down or the IE sessions remain.
Debug.Print oJson.stringify(o) ' can use after but but IE server will shutdown... soon
End Sub

Vous pouvez établir une passerelle vers IE.JSON à partir de VB.
Créer une fonction oIE_JSON

Public g_IE As Object ' global

Public Function oIE_JSON() As Object

    ' for array access o.itemGet(0) o.itemGet("key1")
    JSON_COM_extentions = "" & _
            " Object.prototype.itemGet        =function( i ) { return this[i] }   ;            " & _
            " Object.prototype.propSetStr     =function( prop , val ) { eval('this.' + prop + '  = ""' + protectDoubleQuotes (val) + '""' )   }    ;            " & _
            " Object.prototype.propSetNum     =function( prop , val ) { eval('this.' + prop + '  = ' + val + '')   }    ;            " & _
            " Object.prototype.propSetJSON    =function( prop , val ) { eval('this.' + prop + '  = ' + val + '')   }    ;            " & _
            " Object.prototype.itemSetStr     =function( prop , val ) { eval('this[' + prop + '] = ""' + protectDoubleQuotes (val) + '""' )   }    ;            " & _
            " Object.prototype.itemSetNum     =function( prop , val ) { eval('this[' + prop + '] = ' + val )   }    ;            " & _
            " Object.prototype.itemSetJSON    =function( prop , val ) { eval('this[' + prop + '] = ' + val )   }    ;            " & _
            " function protectDoubleQuotes (str)   { return str.replace(/\\/g, '\\\\').replace(/""/g,'\\""');   }"

    ' document.parentwindow.eval dosen't work some versions of ie eg ie10?
     IEEvalworkaroundjs = "" & _
         " function IEEvalWorkAroundInit ()   { " & _
         " var x=document.getElementById(""myIEEvalWorkAround"");" & _
         " x.IEEval= function( s ) { return eval(s) } ; } ;"

    g_JS_framework = "" & _
      JSON_COM_extentions & _
      IEEvalworkaroundjs

    ' need IE8 and DOC type
    g_JS_HTML = "<!DOCTYPE html>  " & _
         " <script>" & g_JS_framework & _
                  "</script>" & _
         " <body>" & _
         "<script  id=""myIEEvalWorkAround""  onclick=""IEEvalWorkAroundInit()""  ></script> " & _
                 " HEllo</body>"

On Error GoTo error_handler

' Create InternetExplorer Object
Set g_IE = CreateObject("InternetExplorer.Application")
With g_IE
    .navigate "about:blank"
    Do While .Busy: DoEvents: Loop
    Do While .ReadyState <> 4: DoEvents: Loop
    .Visible = False ' control IE interface window
    .Document.Write g_JS_HTML
End With

Set objID = g_IE.Document.getElementById("myIEEvalWorkAround")
objID.Click ' create  eval
Dim oJson As Object

'Set oJson = g_IE.Document.parentWindow.Eval("JSON") ' dosen't work some versions of IE
Set oJson = objID.IEEval("JSON")

Set objID = Nothing
Set oIE_JSON = oJson

Exit Function
error_handler:
MsgBox ("Unexpected Error, I'm quitting. " & Err.Description & ".  " & Err.Number)
g_IE.Quit
Set g_IE = Nothing

End Function

Public Function oIE_JSON_Quit()
         g_IE.Quit
         Exit Function
End Function

Votez plus haut si vous trouvez utile

0 votes

Ne fonctionne pas avec Excel 2013 et IE10 : Impossible d'invoquer des méthodes sur l'objet JSON renvoyé. Tout ce que je peux faire est cstr(oJson) ce qui donne en effet [objet JSON]

0 votes

Thx Je n'ai pas 2013 pour tester mais dès que je l'aurai, je l'examinerai. Si vous trouvez une solution de contournement, dites-le nous.

4voto

Bob77 Points 8749

VB6 - JsonBag, un autre analyseur/générateur JSON devrait également pouvoir être importée dans la VBA sans problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X