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í:
- 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.
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
VB6 - JsonBag, otro analizador / generador JSON también debería ser importable en VBA sin problemas.
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.
Q2 En Excel VBA en Windows, ¿cómo realizar un ciclo a través de una matriz JSON analizada?