enviar web-services json vba serialization vb6

web-services - enviar - json vb6



¿Hay un analizador JSON para VB6/VBA? (13)

Aquí hay una biblioteca "nativa" VB JSON.

Es posible usar JSON que ya está en IE8 +. De esta manera, no dependerá de una biblioteca de terceros que no esté actualizada y no haya sido probada.

ver la versión alternativa de amedeus here

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

Puede unir a IE.JSON desde VB.
Crea una función 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

Vota por si encuentras útil

Estoy intentando consumir un servicio web en VB6. El servicio, que yo controlo, actualmente puede devolver un mensaje SOAP / XML o JSON. Me está resultando realmente difícil averiguar si el tipo SOAP de VB6 (versión 1) puede manejar un object devuelto, a diferencia de los tipos simples como string , int , etc. Hasta ahora no puedo entender qué hacer para que VB6 funcione. jugar con objetos devueltos.

Así que pensé que podría serializar la respuesta en el servicio web como una cadena JSON. ¿Existe un analizador JSON para VB6?


Basado en la solución de ozmike, que no funcionó para mí (Excel 2013 e IE10). La razón es que no pude llamar a los métodos en el objeto JSON expuesto. Entonces, sus métodos ahora están expuestos a través de funciones asociadas a un DOMElement. No sabía que esto es posible (debe ser ese IDispatch-cosa), gracias ozmike.

Como dijo ozmike, no hay libs de terceros, solo 30 líneas de código.

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

La siguiente prueba construye un objeto JavaScript desde cero, luego lo cornea. Luego analiza el objeto e itera sobre sus claves.

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

salidas

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


Como Json no es más que cuerdas, puede manejarse fácilmente si podemos manipularlo de la manera correcta, sin importar cuán compleja sea la estructura. No creo que sea necesario utilizar una biblioteca externa o un convertidor para hacer el truco. Aquí hay un ejemplo en el que he analizado datos JSON utilizando la manipulación de cadenas.

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


Consulte JSON.org para obtener una lista actualizada (ver la parte inferior de la página principal) de los analizadores JSON en muchos idiomas diferentes. A partir de este momento, verá un enlace a dos analizadores JSON diferentes allí:

  • VB-JSON

    • Cuando traté de descargar el archivo zip, Windows dijo que los datos estaban corruptos. Sin embargo, pude usar 7-zip para extraer los archivos. Resulta que la "carpeta" principal en el archivo zip no es reconocida como una carpeta por Windows, por 7-zip puede ver el contenido de esa "carpeta" principal, por lo que puede abrirla y luego extraer los archivos en consecuencia .
    • La sintaxis real para esta biblioteca VB JSON es realmente 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")

    • Nota: Tuve que agregar la biblioteca "Microsoft Scripting Runtime" y "Microsoft ActiveX Data Objects 2.8" como referencias a través de Herramientas> Referencias en el editor de VBA.
    • Nota: El código VBJSON en realidad se basa en un proyecto de código de google vba-json . Sin embargo, VBJSON promete varias correcciones de errores de la versión original.
  • PW.JSON
    • Esta es en realidad una biblioteca para VB.NET , así que no pasé mucho tiempo investigando.

Fórmula en una CELDA EXCEL

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

PANTALLAS: 22.2

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

PANTALLAS: 2222

  • INSTRUCCIONES:
  • Paso 1. presione ALT + F11
  • Paso 2. Insertar -> Módulo
  • Paso 3. herramientas -> referencias -> marque Microsoft Script Control 1.0
  • Etapa 4. pega esto debajo
  • Paso5. ALT + Q cierra la ventana VBA.

Herramientas -> Referencias -> 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


Puede escribir un complemento Excel-DNA en VB.NET. Excel-DNA es una biblioteca delgada que le permite escribir XLL en .NET. De esta forma tendrá acceso a todo el universo .NET y podrá usar cosas como http://james.newtonking.com/json , un marco JSON que deserializa JSON en cualquier clase personalizada.

Si está interesado, aquí hay un resumen de cómo crear un cliente Excel JSON genérico para Excel usando VB.NET:

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

Y aquí está el enlace al código: https://github.com/spreadgit/excel-json-client/blob/master/excel-json-client.dna


Sé que esta es una pregunta antigua pero espero que mi respuesta sea de gran ayuda para los demás que siguen viniendo a esta página después de buscar "vba json".

Encontré esta page muy útil. Proporciona varias clases de VBA compatibles con Excel que se ocupan del procesamiento de datos en formato JSON.


Sugeriría usar un componente .Net. Puede usar componentes .Net desde VB6 a través de Interop - aquí hay un tutorial . Creo que los componentes .Net serán más confiables y contarán con un mejor soporte que cualquier otro producto para VB6.

Hay componentes en el marco de Microsoft .Net como DataContractJsonSerializer o JavaScriptSerializer . También puede usar bibliotecas de terceros como JSON.NET .


Usando las características de JavaScript para analizar JSON, además de ScriptControl, podemos crear un analizador en VBA que enumerará todos y cada uno de los puntos de datos dentro de JSON. No importa cuán anidada o compleja sea la estructura de datos, siempre que proporcionemos un JSON válido, este analizador devolverá una estructura de árbol completa.

Los métodos Eval, getKeys y getProperty de JavaScript proporcionan bloques de construcción para validar y leer JSON.

Junto con una función recursiva en VBA podemos iterar a través de todas las claves (hasta el nivel n-ésimo) en una cadena JSON. Luego, usando un control Tree (usado en este artículo) o un diccionario o incluso en una hoja de trabajo simple, podemos organizar los datos JSON según sea necesario.

Aquí se incluye el código completo de VBA. Al usar las funciones de JavaScript para analizar JSON, además de ScriptControl, podemos crear un analizador en VBA que enumerará todos y cada uno de los puntos de datos dentro de JSON. No importa cuán anidada o compleja sea la estructura de datos, siempre que proporcionemos un JSON válido, este analizador devolverá una estructura de árbol completa.

Los métodos Eval, getKeys y getProperty de JavaScript proporcionan bloques de construcción para validar y leer JSON.

Junto con una función recursiva en VBA podemos iterar a través de todas las claves (hasta el nivel n-ésimo) en una cadena JSON. Luego, usando un control Tree (usado en este artículo) o un diccionario o incluso en una hoja de trabajo simple, podemos organizar los datos JSON según sea necesario.

Código completo de VBA aquí.


este es el código de ejemplo vb6, probado bien, trabajos realizados

de los buenos ejemplos anteriores, hice cambios y obtuve este buen resultado

puede leer claves {} y matrices []

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



VBA-JSON por Tim Hall, MIT con licencia y en GitHub . Es otra bifurcación de vba-json que surgió a finales de 2014. Afirma que debe trabajar en Mac Office y Windows de 32 bits y 64 bits.


ACTUALIZACIÓN: Encontré una manera más segura de analizar JSON que usar Eval, esta publicación de blog muestra los peligros de Eval ... exceldevelopmentplatform.blogspot.com/2018/01/…

Tarde en esta fiesta, pero lo siento chicos, pero de lejos la forma más fácil es utilizar Microsoft Script Control. Algunos ejemplos de código que usa VBA.CallByName para explorar

''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

De hecho, he hecho una serie de preguntas y respuestas que exploran temas relacionados con JSON / VBA.

Q1 En Excel VBA en Windows, ¿cómo mitigar el problema del cruce de sintaxis de punto del JSON analizado roto por el comportamiento de capitalización de IDE?

Q2 En Excel VBA en Windows, ¿cómo realizar un ciclo a través de una matriz JSON analizada?

Q3 En Excel VBA en Windows, ¿cómo obtener la respresentación JSON codificada en lugar de "[Objeto objeto]" para las variables JSON analizadas?

P4 En Windows Excel VBA, ¿cómo obtener las claves JSON para adelantarse al "Error en tiempo de ejecución ''438'': el objeto no admite esta propiedad o método"?

Q5 En Excel VBA en Windows, para las variables JSON analizadas, ¿qué es este JScriptTypeInfo de todos modos?