Есть ли анализатор JSON для VB6 / VBA?
Я пытаюсь использовать веб-сервис в VB6. Служба, которой я управляю, в настоящее время может возвращать сообщение SOAP/XML или JSON. Мне действительно трудно понять, может ли тип SOB VB6 (версия 1) обрабатывать возвращаемый object
- в отличие от простых типов, таких как string
, int
и т.д. До сих пор я не могу понять, что мне нужно сделать, чтобы заставить VB6 играть с возвращенными объектами.
Поэтому я подумал, что могу сериализовать ответ в веб-сервисе в виде строки JSON. Существует ли анализатор JSON для VB6?
16 ответов
Посетите JSON.org, чтобы получить обновленный список (см. Внизу главной страницы) анализаторов JSON на разных языках. На момент написания этой статьи вы увидите ссылку на два разных анализатора JSON:
- Когда я попытался загрузить zip-файл, Windows сказала, что данные повреждены. Тем не менее, я смог использовать 7-zip для извлечения файлов. Оказывается, что основная "папка" в zip-файле не распознается Windows как папка, 7-zip может видеть содержимое этой основной "папки", поэтому вы можете открыть ее и затем извлечь файлы соответствующим образом.,
Фактический синтаксис для этой библиотеки VB JSON очень прост:
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")
- Примечание. Мне пришлось добавить библиотеку "Среда выполнения сценариев Microsoft" и "Объекты данных Microsoft ActiveX 2.8" в качестве ссылок через Инструменты> Ссылки в редакторе VBA.
- Примечание. Код VBJSON фактически основан на проекте Google Code vba-json. Тем не менее, VBJSON обещает несколько исправлений ошибок из оригинальной версии.
- PW.JSON
- На самом деле это библиотека для VB.NET, так что я не тратил много времени на ее изучение.
Построение на озмике решения, которое у меня не сработало (Excel 2013 и IE10). Причина в том, что я не смог вызвать методы для открытого объекта JSON. Поэтому его методы теперь доступны через функции, прикрепленные к элементу DOME. Не знал, что это возможно (должно быть, это IDispatch-вещь), спасибо ozmike.
Как заявил Озмик, сторонних библиотек нет, всего 30 строк кода.
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
Следующий тест создает JavaScript-объект с нуля, а затем переводит его в строку. Затем он анализирует объект и перебирает его ключи.
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
выходы
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
Я знаю, что это старый вопрос, но мой ответ, надеюсь, окажет большую помощь тем, кто продолжает посещать эту страницу после поиска слова "vba json".
Я нашел эту страницу очень полезной. Он предоставляет несколько совместимых с Excel классов VBA, которые занимаются обработкой данных в формате JSON.
Поскольку Json - не что иное, как струны, с ним легко можно обращаться, если мы сможем правильно им управлять, независимо от того, насколько сложна структура. Я не думаю, что для этого нужно использовать какую-либо внешнюю библиотеку или конвертер. Вот пример, где я проанализировал данные json, используя манипуляции со строками.
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
VBA-JSON, Тим Холл, MIT, лицензированный и на GitHub. Это еще одна ветка vba-json, появившаяся в конце 2014 года. Заявки на работу на Mac Office и Windows 32-битной и 64-битной версиях.
ОБНОВЛЕНИЕ: Обнаруженный более безопасный способ анализа JSON, чем использование Eval, этот пост в блоге показывает опасности Eval... http://exceldevelopmentplatform.blogspot.com/2018/01/vba-parse-json-safer-with-jsonparse-and.html
Поздно к этой вечеринке, но извините, ребята, но, безусловно, самый простой способ - использовать Microsoft Script Control. Пример кода, который использует VBA.CallByName для детализации
'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
На самом деле я провел серию вопросов и ответов, в которых рассматриваются темы, связанные с JSON/VBA.
Q2 В Excel VBA в Windows, как пройти через анализируемый массив JSON?
Q5 В Excel VBA в Windows, для проанализированных переменных JSON, что это за JScriptTypeInfo?
VB6 - JsonBag, еще один JSON Parser/Generator также должен быть импортирован в VBA без особых проблем.
Вот "родная" библиотека VSON JSON.
Можно использовать JSON, который уже есть в IE8+. Таким образом, вы не зависите от сторонней библиотеки, которая устарела и не прошла проверку.
см. альтернативную версию Амедея здесь
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
Вы можете подключиться к IE.JSON из VB.
Создать функцию 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
Голосуйте, если вы считаете полезным
Поймите, это старый пост, но я недавно наткнулся на него, добавляя потребление веб-сервисов в старое приложение VB6. Принятый ответ (VB-JSON) все еще действителен и, похоже, работает. Однако я обнаружил, что Chilkat был обновлен и теперь включает в себя функции REST и JSON, что делает его универсальным (хотя и платным) инструментом для меня. У них даже есть онлайн-генератор кода, который генерирует код для анализа вставленных данных JSON.
Я бы предложил использовать компонент.Net. Вы можете использовать.Net компоненты из VB6 через Interop - вот учебник. Я предполагаю, что.Net-компоненты будут более надежными и лучше поддерживаются, чем все, что производится для VB6.
В инфраструктуре Microsoft .Net есть такие компоненты, как DataContractJsonSerializer или JavaScriptSerializer. Вы также можете использовать сторонние библиотеки, такие как JSON.NET.
Вы можете написать надстройку Excel-DNA в VB.NET. Excel-DNA - это тонкая библиотека, которая позволяет вам писать XLL в.NET. Таким образом, вы получаете доступ ко всей вселенной.NET и можете использовать такие вещи, как http://james.newtonking.com/json - инфраструктуру JSON, которая десериализует JSON в любом пользовательском классе.
Если вам интересно, вот описание того, как создать универсальный JSON-клиент Excel для Excel с использованием VB.NET:
http://optionexplicitvba.com/2014/05/09/developing-a-json-excel-add-in-with-vb-net/
А вот ссылка на код: https://github.com/spreadgit/excel-json-client/blob/master/excel-json-client.dna
Нужен ли он вам для VB6, VBA, VB.NET, C#, Delphi или любого другого языка программирования на платформе Windows, проверьте JSON Essentials. Его возможности выходят далеко за рамки простого синтаксического анализа и запросов JSON. Используя JSON Essentials, вы можете сериализовать объекты в JSON, выполнять HTTP-вызовы JSON и получать в ответ анализируемый JSON DOM, если вам это нужно, переформатировать JSON, использовать файлы, реестр, потоки памяти или HTTP/HTTPS для записи и загрузки данных JSON в Кодировки UTF-8/16/32 и ASCII/EASCII, а также поддержка схемы JSON. Кроме того, он исключительно быстр, стабилен, соответствует стандартам, активно развивается и поддерживается. И у него тоже бесплатная лицензия.
Вот несколько быстрых примеров, первый показывает, как анализировать и запрашивать JSON:
' Create JSON document object.
Dim document As JsonDocument
Set document = New JsonDocument
' Parse JSON.
document.parse "{""a"":true,""b"":123,""c"":{},""d"":[""abc""]}"
' Select the first node of the 'd' node using JSON Pointer
' starting from the root document node.
Dim node_abc As IJsonNode
Set node_abc = document.root.select("/d/0")
' Select node 'a' starting from the previously selected
' first child node of node 'd' and traversing first up to
' the root node and then down to node 'a' using Relative
' JSON Pointer.
Dim node_a As IJsonNode
Set node_a = node_abc.select("rel:2/a")
Следующий касается сохранения/загрузки файла:
' Load JSON from a UTF-16 file in the current directory
document.load "file://test.json", "utf-16"
' Save document to the current directory using UTF-8 encoding.
document.save "file://test.json", "utf-8"
Вот как просто сделать запрос HTTP JSON с помощью JSON Essentials:
' Load document from HTTP response.
Dim status As IJsonStatus
Set status = document.load("http://postman-echo.com/get")
И вот как делать сложные запросы HTTP JSON и анализировать ответы JSON:
' Create and fill a new document model object.
Dim model As SomeDocumentModel
Set model = New SomeDocumentModel
model.a = True
model.b = 123
Set model.c = New EmptyDocumentModel
model.d = Array("abc")
' Load JSON data from a document model object.
document.load model
Dim request As String
' Specify HTTP method explicitly.
request = "json://{" + _
"""method"" : ""PUT"","
' Add custom HTTP query parameters.
request = request + _
"""query"" : {" + _
"""a"" : ""#a""," + _
"""b"" : ""#b""," + _
"""c"" : ""#c""" + _
"},"
' Add custom HTTP form data parameters.
request = request + _
"""form"" : {" + _
"""d"" : ""#d""," + _
"""e"" : ""#e""," + _
"""f"" : ""#f""" + _
"},"
' Add custom HTTP headers.
request = request + _
"""form"" : {" + _
"""a"" : ""#1""," + _
"""b"" : ""#2""," + _
"""c"" : ""#3""" + _
"},"
' Override default TCP timeouts.
request = request + _
"""timeouts"" : {" + _
"""connect"" : 5000," + _
"""resolve"" : 5000," + _
"""send"" : 5000," + _
"""receive"" : 5000" + _
"},"
' Require response JSON document to contains HTTP response status code,
' HTTP response headers and HTTP response body nested as JSON.
request = request + _
"""response"" : {" + _
"""status"" : true," + _
"""headers"" : true," + _
"""body"" : ""json""" + _
"}" + _
"}"
' Save JSON document to the specified endpoint as HTTP PUT request
' that is encoded in UTF-8.
Dim status As IJsonStatus
Set status = document.save("http://postman-echo.com/put", "utf-8", request)
' Print JSON data of the parsed JSON response
Debug.Print status.response.json
И, наконец, вот как создать схему JSON и выполнить проверку документа JSON:
' Create schema JSON document object.
Dim schemaDoc As JsonDocument
Set schemaDoc = New JsonDocument
' Load JSON schema that requires a node to be an array of numeric values.
schemaDoc.parse _
"{" + _
"""$id"": ""json:numeric_array""," + _
"""type"": ""array""," + _
"""items"": {" + _
"""type"": ""number""" + _
"}" + _
"}"
' Create schema collection and add the schema document to it.
Dim schemas As JsonSchemas
Set schemas = New JsonSchemas
Dim schema As IJsonSchema
Set schema = schemas.Add(schemaDoc, "json:numeric_array")
' Create JSON document object.
Dim instanceDoc As JsonDocument
Set instanceDoc = New JsonDocument
' Load JSON, an array of numeric values that is expected to
' satisfy schema requirements.
instanceDoc.load Array(0, 1, 2)
' Validate JSON instance document against the added schema.
Dim status As IJsonStatus
Set status = schema.validate(instanceDoc)
' Ensure the validation passed successfully.
Debug.Print IIf(status.success, "Validated", "Not-validated")
Используя JavaScript-функции синтаксического анализа JSON, помимо ScriptControl, мы можем создать синтаксический анализатор в VBA, который будет перечислять каждую точку данных внутри JSON. Независимо от того, насколько вложенной или сложной является структура данных, пока мы предоставляем правильный JSON, этот синтаксический анализатор будет возвращать полную древовидную структуру.
Методы JavaScript Eval, getKeys и getProperty предоставляют строительные блоки для проверки и чтения JSON.
В сочетании с рекурсивной функцией в VBA мы можем перебирать все ключи (до n-го уровня) в строке JSON. Затем, используя элемент управления Tree (используемый в этой статье), словарь или даже простой лист, мы можем упорядочить данные JSON по мере необходимости.
Полный код VBA здесь. Используя JavaScript-функции синтаксического анализа JSON, помимо ScriptControl, мы можем создать синтаксический анализатор в VBA, который будет перечислять каждую точку данных внутри JSON. Независимо от того, насколько вложенной или сложной является структура данных, пока мы предоставляем правильный JSON, этот синтаксический анализатор будет возвращать полную древовидную структуру.
Методы JavaScript Eval, getKeys и getProperty предоставляют строительные блоки для проверки и чтения JSON.
В сочетании с рекурсивной функцией в VBA мы можем перебирать все ключи (до n-го уровня) в строке JSON. Затем, используя элемент управления Tree (используемый в этой статье), словарь или даже простой лист, мы можем упорядочить данные JSON по мере необходимости.
Это пример кода vb6, проверено нормально, работа сделана
Из приведенных выше хороших примеров я внес изменения и получил этот хороший результат
он может читать ключи {} и массивы []
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/VBA] Анализ JSON для встроенных коллекций VBA.Collections с поддержкой JSON Path
Это отдельный автономный модуль (без классов), который анализирует JSON во вложенных встроенных коллекциях (быстро и экономично) и поддерживает практичное подмножество JSON Path (он же XPath для JSON) для извлечения значений.
Это означает, что нет необходимости безумно вкладывать
Item
звонит как
oJson.Item("first").Item("second").Item("array").Item(0)`
. . . но для доступа к вложенным значениям можно просто использовать один вызов
JsonValue(oJson, "$.first.second.array[0]")
. . . и извлекать данные из самой глубины иерархии по мере необходимости.
Формула в клетке EXCEL
=JSON2("{mykey:1111, mykey2:{keyinternal1:22.1,keyinternal2:22.2}, mykey3:3333}", "mykey2", "keyinternal2")
ОТОБРАЖАЕТ: 22,2
=JSON("{mykey:1111,mykey2:2222,mykey3:3333}", "mykey2")
ПОКАЗЫВАЕТ: 2222
- ИНСТРУКЦИИ:
- Шаг 1. нажмите ALT+F11
- Шаг 2. Вставить -> Модуль
- Шаг 3. инструменты -> ссылки -> отметьте Microsoft Script Control 1.0
- Step4. вставьте это ниже.
- Step5. ALT + Q закрыть окно VBA.
Сервис -> Ссылки -> 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