Esiste un parser JSON per VB6 / VBA?

Sto cercando di utilizzare un servizio Web in VB6. Il servizio – che controllo – attualmente può restituire un messaggio SOAP / XML o JSON. Sto attraversando un periodo davvero difficile per capire se il tipo SOAP di VB6 (versione 1) può gestire un object restituito – al contrario di tipi semplici come string , int , ecc. Finora non riesco a capire cosa devo fare per portare il VB6 a gioca con oggetti restituiti.

Quindi ho pensato di serializzare la risposta nel servizio web come una stringa JSON. Esiste un parser JSON per VB6?

    Dai un’occhiata a JSON.org per un elenco aggiornato (vedi in fondo alla pagina principale) di parser JSON in molte lingue diverse. Al momento della stesura di questo documento, vedrai un collegamento a due diversi parser JSON:

    • VB-JSON

      • Quando ho provato a scaricare il file zip, Windows ha detto che i dati erano corrotti. Tuttavia, sono stato in grado di utilizzare 7-zip per estrarre i file. Si scopre che la “cartella” principale nel file zip non è riconosciuta come una cartella da Windows, da 7-zip può vedere il contenuto di quella “cartella” principale, quindi è ansible aprirlo e quindi estrarre i file di conseguenza .
      • La syntax attuale per questa libreria VB JSON è davvero semplice:

         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") 
      • Nota: ho dovuto aggiungere la libreria “Microsoft Scripting Runtime” e “Microsoft ActiveX Data Objects 2.8” come riferimenti tramite Strumenti> Riferimenti nell’editor VBA.
      • Nota: il codice VBJSON è in realtà basato su un progetto di codice google vba-json . Tuttavia, VBJSON promette diverse correzioni di bug dalla versione originale.
    • PW.JSON
      • Questa è in realtà una libreria per VB.NET , quindi non ho passato molto tempo a esaminarla.

    Basandosi sulla soluzione di ozmike, che non ha funzionato per me (Excel 2013 e IE10). Il motivo è che non potevo chiamare i metodi sull’object JSON esposto. Quindi i suoi metodi sono ora esposti attraverso funzioni associate a un DOMElement. Non sapevo che questo è ansible (deve essere quella cosa di IDispatch), grazie a ozmike.

    Come affermato da Ozmike, niente librerie di terze parti, solo 30 righe di codice.

     Option Explicit Public JSON As Object Private ie As Object Public Sub initJson() Dim html As String html = "< !DOCTYPE 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 

    Il seguente test costruisce un object JavaScript da zero, quindi lo stringa. Quindi analizza l’object indietro e itera sulle sue chiavi.

     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 

    uscite

     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 

    So che questa è una vecchia domanda, ma la mia risposta spero possa essere di grande aiuto per gli altri che continuano a venire su questa pagina dopo aver cercato “vba json”.

    Ho trovato questa pagina molto utile. Fornisce diverse classi VBA compatibili con Excel che trattano i dati di elaborazione in formato JSON.

    Ecco una libreria VB JSON “nativa”.

    È ansible utilizzare JSON già presente in IE8 +. In questo modo il tuo non dipende da una libreria di terze parti che non è aggiornata e non è stata testata.

    vedi la versione alternativa di Amedeo qui

     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 

    Puoi colbind a IE.JSON da VB.
    Crea una funzione 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> " & _ " " & _ " " & _ " " & _ " HEllo" 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 

    Votalo se trovi utile

    VBA-JSON di Tim Hall, MIT con licenza e su GitHub . È un altro fork di vba-json che è emerso alla fine del 2014. Chiede di lavorare su Mac Office e Windows a 32 bit e 64 bit.

    AGGIORNAMENTO: trovato un modo più sicuro di analizzare JSON rispetto all’utilizzo di Eval, questo post sul blog mostra i pericoli di Eval … http://exceldevelopmentplatform.blogspot.com/2018/01/vba-parse-json-safer-with-jsonparse- and.html

    In ritardo a questa festa, ma mi dispiace ragazzi, ma il modo più semplice è usare Microsoft Script Control. Alcuni esempi di codice che utilizzano VBA.CallByName per eseguire il drill-in

     'Tools->References-> 'Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:\Windows\SysWOW64\msscript.ocx Private Sub TestJSONParsingWithCallByName() Dim oScriptEngine As ScriptControl Set oScriptEngine = New ScriptControl oScriptEngine.Language = "JScript" Dim sJsonString As String sJsonString = "{'key1': 'value1' ,'key2': { 'key3': 'value3' } }" Dim objJSON As Object Set objJSON = oScriptEngine.Eval("(" + sJsonString + ")") Debug.Assert VBA.CallByName(objJSON, "key1", VbGet) = "value1" Debug.Assert VBA.CallByName(VBA.CallByName(objJSON, "key2", VbGet), "key3", VbGet) = "value3" End Sub 

    Ho effettivamente fatto una serie di domande e risposte che esplorano argomenti correlati a JSON / VBA.

    Q1 In Excel VBA su Windows, come mitigare il problema della traversal della syntax del punto del JSON analizzato interrotto dal comportamento di capitalizzazione di IDE?

    Q2 In Excel VBA su Windows, come analizzare un array JSON analizzato?

    Q3 In Excel VBA su Windows, come ottenere rappresentazioni JSON con stringa invece di “[object object]” per le variabili JSON analizzate?

    Q4 In VBA di Windows Excel, come ottenere chiavi JSON per pre-empt “Errore di run-time ‘438’: Object non supporta questa proprietà o metodo”?

    Q5 In Excel VBA su Windows, per le variabili JSON analizzate, che cos’è questo JScriptTypeInfo?

    VB6 – JsonBag, un altro parser / generatore JSON dovrebbe anche essere importabile in VBA con pochi problemi.

    Suggerirei di usare un componente .Net. Puoi utilizzare i componenti .Net da VB6 tramite Interop – ecco un tutorial . La mia ipotesi è che i componenti .Net saranno più affidabili e meglio supportati di qualsiasi altro prodotto per VB6.

    Ci sono componenti nel framework Microsoft .Net come DataContractJsonSerializer o JavaScriptSerializer . Potresti anche utilizzare librerie di terze parti come JSON.NET .

    Potresti scrivere un componente aggiuntivo Excel-DNA in VB.NET. Excel-DNA è una libreria sottile che consente di scrivere XLL in .NET. In questo modo si ottiene l’accesso all’intero universo .NET e si possono usare cose come http://james.newtonking.com/json – un framework JSON che deserializza JSON in qualsiasi class personalizzata.

    Se sei interessato, ecco una descrizione di come creare un client JSON Excel generico per Excel utilizzando VB.NET:

    http://optionexplicitvba.com/2014/05/09/developing-a-json-excel-add-in-with-vb-net/

    Ed ecco il link al codice: https://github.com/spreadgit/excel-json-client/blob/master/excel-json-client.dna

    Utilizzando le funzioni JavaScript di analisi di JSON, oltre a ScriptControl, possiamo creare un parser in VBA che elencherà ogni singolo punto di dati all’interno del JSON. Non importa quanto nidificata o complessa sia la struttura dati, purché forniamo un JSON valido, questo parser restituirà una struttura ad albero completa.

    I metodi Eval, getKeys e getProperty di JavaScript forniscono elementi costitutivi per la convalida e la lettura di JSON.

    Accoppiato con una funzione ricorsiva in VBA possiamo scorrere tutti i tasti (fino all’ennesimo livello) in una stringa JSON. Quindi, usando un controllo Tree (usato in questo articolo) o un dizionario o anche su un semplice foglio di lavoro, possiamo organizzare i dati JSON come richiesto.

    Codice VBA completo qui. Utilizzando le funzioni JavaScript di analisi di JSON, sopra a ScriptControl, possiamo creare un parser in VBA che elencherà ogni punto dati all’interno del JSON. Non importa quanto nidificata o complessa sia la struttura dati, purché forniamo un JSON valido, questo parser restituirà una struttura ad albero completa.

    I metodi Eval, getKeys e getProperty di JavaScript forniscono elementi costitutivi per la convalida e la lettura di JSON.

    Accoppiato con una funzione ricorsiva in VBA possiamo scorrere tutti i tasti (fino all’ennesimo livello) in una stringa JSON. Quindi, usando un controllo Tree (usato in questo articolo) o un dizionario o anche su un semplice foglio di lavoro, possiamo organizzare i dati JSON come richiesto.

    Codice VBA completo qui.

    Come Json non è altro che stringhe quindi può essere facilmente gestito se possiamo manipolarlo nel modo giusto, non importa quanto sia complessa la struttura. Non penso sia necessario utilizzare alcuna libreria o convertitore esterno per fare il trucco. Ecco un esempio in cui ho analizzato i dati JSON usando la manipolazione delle stringhe.

     Sub Json_coder() Dim http As New XMLHTTP60, itm As Variant With http .Open "GET", "http://jsonplaceholder.typicode.com/users", False .send itm = Split(.responseText, "id"":") End With x = UBound(itm) For y = 1 To x Cells(y, 1) = Split(Split(itm(y), "name"": """)(1), """")(0) Cells(y, 2) = Split(Split(itm(y), "username"": """)(1), """")(0) Cells(y, 3) = Split(Split(itm(y), "email"": """)(1), """")(0) Cells(y, 4) = Split(Split(itm(y), "street"": """)(1), """")(0) Cells(y, 5) = Split(Split(itm(y), "suite"": """)(1), """")(0) Cells(y, 6) = Split(Split(itm(y), "city"": """)(1), """")(0) Cells(y, 7) = Split(Split(itm(y), "zipcode"": """)(1), """")(0) Cells(y, 8) = Split(Split(itm(y), "phone"": """)(1), """")(0) Cells(y, 9) = Split(Split(itm(y), "website"": """)(1), """")(0) Cells(y, 10) = Split(Split(Split(itm(y), "company"": ")(1), "name"": """)(1), """")(0) Cells(y, 11) = Split(Split(itm(y), "catchPhrase"": """)(1), """")(0) Cells(y, 12) = Split(Split(itm(y), "bs"": """)(1), """")(0) Next y End Sub 

    questo è il codice di esempio vb6, testato ok, funziona

    dai buoni esempi sopra, ho apportato delle modifiche e ottenuto questo buon risultato

    può leggere le chiavi {} e gli array []

     Option Explicit 'in vb6 click "Tools"->"References" then 'check the box "Microsoft Script Control 1.0"; Dim oScriptEngine As New ScriptControl Dim objJSON As Object ''to use it Private Sub Command1_Click() MsgBox JsonGet("key1", "{'key1': 'value1' ,'key2': { 'key3': 'value3' } }")''returns "value1" MsgBox JsonGet("key2.key3", "{'key1': 'value1' ,'key2': { 'key3': 'value3' } }") ''returns "value3" MsgBox JsonGet("result.0.Ask", "{'result':[{'MarketName':'BTC-1ST','Bid':0.00004718,'Ask':0.00004799},{'MarketName':'BTC-2GIVE','Bid':0.00000073,'Ask':0.00000074}]}") ''returns "0.00004799" MsgBox JsonGet("mykey2.keyinternal1", "{mykey:1111, mykey2:{keyinternal1:22.1,keyinternal2:22.2}, mykey3:3333}") ''returns "22.1" End Sub Public Function JsonGet(eKey$, eJsonString$, Optional eDlim$ = ".") As String Dim tmp$() Static sJsonString$ If Trim(eKey$) = "" Or Trim(eJsonString$) = "" Then Exit Function If sJsonString <> eJsonString Then sJsonString = eJsonString oScriptEngine.Language = "JScript" Set objJSON = oScriptEngine.Eval("(" + eJsonString + ")") End If tmp = Split(eKey, eDlim) If UBound(tmp) = 0 Then JsonGet = VBA.CallByName(objJSON, eKey, VbGet): Exit Function Dim i&, o As Object Set o = objJSON For i = 0 To UBound(tmp) - 1 Set o = VBA.CallByName(o, tmp(i), VbGet) Next i JsonGet = VBA.CallByName(o, tmp(i), VbGet) Set o = Nothing End Function Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Set objJSON = Nothing End Sub 

    Formula in EXCEL CELL

     =JSON2("{mykey:1111, mykey2:{keyinternal1:22.1,keyinternal2:22.2}, mykey3:3333}", "mykey2", "keyinternal2") 

    VISUALIZZAZIONI: 22.2

     =JSON("{mykey:1111,mykey2:2222,mykey3:3333}", "mykey2") 

    VISUALIZZAZIONI: 2222

    • ISTRUZIONI:
    • Passo 1. premere ALT + F11
    • Passo 2. Inserisci -> Modulo
    • Fase 3. strumenti -> riferimenti -> spunta Microsoft Script Control 1.0
    • Fase 4. incollalo qui sotto.
    • Step5. ALT + Q chiudi la finestra VBA.

    Strumenti -> Riferimenti -> Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C: \ Windows \ SysWOW64 \ msscript.ocx

     Public Function JSON(sJsonString As String, Key As String) As String On Error GoTo err_handler Dim oScriptEngine As ScriptControl Set oScriptEngine = New ScriptControl oScriptEngine.Language = "JScript" Dim objJSON As Object Set objJSON = oScriptEngine.Eval("(" + sJsonString + ")") JSON = VBA.CallByName(objJSON, Key, VbGet) Err_Exit: Exit Function err_handler: JSON = "Error: " & Err.Description Resume Err_Exit End Function Public Function JSON2(sJsonString As String, Key1 As String, Key2 As String) As String On Error GoTo err_handler Dim oScriptEngine As ScriptControl Set oScriptEngine = New ScriptControl oScriptEngine.Language = "JScript" Dim objJSON As Object Set objJSON = oScriptEngine.Eval("(" + sJsonString + ")") JSON2 = VBA.CallByName(VBA.CallByName(objJSON, Key1, VbGet), Key2, VbGet) Err_Exit: Exit Function err_handler: JSON2 = "Error: " & Err.Description Resume Err_Exit End Function