/ / Обробити об'єкт JSON у відповіді XMLHttp у коді Excel VBA - json, excel, vba, excel-vba, xmlhttprequest

Обмінюватися об'єктом JSON в XMLHttp-відповіді у коді Excel VBA - json, excel, vba, excel-vba, xmlhttprequest

Мені потрібно обробляти об'єкт JSON, який є відповіддю XMLHTTPRequest в Excel VBA. Я написав код нижче, але він не працює:

  Dim sc As Object
Set sc = CreateObject("ScriptControl")
sc.Language = "JScript"

Dim strURL As String: strURL = "blah blah"

Dim strRequest
Dim XMLhttp: Set XMLhttp = CreateObject("msxml2.xmlhttp")
Dim response As String

XMLhttp.Open "POST", strURL, False
XMLhttp.setrequestheader "Content-Type", "application/x-www-form-urlencoded"
XMLhttp.send strRequest
response = XMLhttp.responseText
sc.Eval ("JSON.parse("" + response + "")")

Я отримую помилку Помилка виконання "429" компонент ActiveX не може створювати об'єкт в рядку Set sc = CreateObject("ScriptControl")

Як ми проаналізували об'єкт JSON, як ви отримуєте доступ до значень об'єкта JSON?

П.С. Моя JSON Приклад об'єкта: {"Success":true,"Message":"Blah blah"}

Відповіді:

10 за відповідь № 1

Код отримує дані з сайту nseindia, який надходить як рядок JSON в responseDiv елемент

Необхідні посилання

введіть опис зображення тут

3 класу модуль я використовував

  • cJSONScript
  • cStringBuilder
  • JSON

(Я вибрав ці модулі класу з тут)

Ви можете завантажити файл з цього файлу посилання

Стандартний модуль

Const URl As String = "http://www.nseindia.com/live_market/dynaContent/live_watch/get_quote/GetQuote.jsp?symbol=ICICIBANK"
Sub xmlHttp()

Dim xmlHttp As Object
Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
xmlHttp.Open "GET", URl & "&rnd=" & WorksheetFunction.RandBetween(1, 99), False
xmlHttp.setRequestHeader "Content-Type", "text/xml"
xmlHttp.send

Dim html As MSHTML.HTMLDocument
Set html = New MSHTML.HTMLDocument
html.body.innerHTML = xmlHttp.ResponseText

Dim divData As Object
Set divData = html.getElementById("responseDiv")
"?divData.innerHTML
" Here you will get a string which is a JSON data

Dim strDiv As String, startVal As Long, endVal As Long
strDiv = divData.innerHTML
startVal = InStr(1, strDiv, "data", vbTextCompare)
endVal = InStr(startVal, strDiv, "]", vbTextCompare)
strDiv = "{" & Mid(strDiv, startVal - 1, (endVal - startVal) + 2) & "}"


Dim JSON As New JSON

Dim p As Object
Set p = JSON.parse(strDiv)

i = 1
For Each item In p("data")(1)
Cells(i, 1) = item
Cells(i, 2) = p("data")(1)(item)
i = i + 1
Next

End Sub

8 для відповіді № 2

Я мав великий успіх з наступною бібліотекою:

https://github.com/VBA-tools/VBA-JSON

Бібліотека використовує Scripting.Dictionary для об'єктів і Collection для масивів і у мене не було ніяких проблем при аналізі досить складних файлів json.

Що стосується додаткової інформації про синтаксичний аналіз json, перевірте це питання на певному фоні з питань, що оточують об'єкт JScriptTypeInfo, який повернуто з виклику sc.Eval:

Excel VBA: проаналізовано цикл об'єктів JSON

Нарешті, для деяких корисних класів для роботи з XMLHTTPRequest, невелика заглушка для мого проекту, VBA-Web:

https://github.com/VBA-tools/VBA-Web


2 для відповіді № 3

Я знаю це старе питання, але я створив простий спосіб спілкування Json з веб-запитів. Де я також загорнула веб-запит.

Доступний тут

Вам потрібен наступний код як class module називається Json

Public Enum ResponseFormat
Text
Json
End Enum
Private pResponseText As String
Private pResponseJson
Private pScriptControl As Object
"Request method returns the responsetext and optionally will fill out json or xml objects
Public Function request(url As String, Optional postParameters As String = "", Optional format As ResponseFormat = ResponseFormat.Json) As String
Dim xml
Dim requestType As String
If postParameters <> "" Then
requestType = "POST"
Else
requestType = "GET"
End If

Set xml = CreateObject("MSXML2.XMLHTTP")
xml.Open requestType, url, False
xml.setRequestHeader "Content-Type", "application/json"
xml.setRequestHeader "Accept", "application/json"
If postParameters <> "" Then
xml.send (postParameters)
Else
xml.send
End If
pResponseText = xml.ResponseText
request = pResponseText
Select Case format
Case Json
SetJson
End Select
End Function
Private Sub SetJson()
Dim qt As String
qt = """"
Set pScriptControl = CreateObject("scriptcontrol")
pScriptControl.Language = "JScript"
pScriptControl.eval "var obj=(" & pResponseText & ")"
"pScriptControl.ExecuteStatement "var rootObj = null"
pScriptControl.AddCode "function getObject(){return obj;}"
"pScriptControl.eval "var rootObj=obj[" & qt & "query" & qt & "]"
pScriptControl.AddCode "function getRootObject(){return rootObj;}"
pScriptControl.AddCode "function getCount(){ return rootObj.length;}"
pScriptControl.AddCode "function getBaseValue(){return baseValue;}"
pScriptControl.AddCode "function getValue(){ return arrayValue;}"
Set pResponseJson = pScriptControl.Run("getObject")
End Sub
Public Function setJsonRoot(rootPath As String)
If rootPath = "" Then
pScriptControl.ExecuteStatement "rootObj = obj"
Else
pScriptControl.ExecuteStatement "rootObj = obj." & rootPath
End If
Set setJsonRoot = pScriptControl.Run("getRootObject")
End Function
Public Function getJsonObjectCount()
getJsonObjectCount = pScriptControl.Run("getCount")
End Function
Public Function getJsonObjectValue(path As String)
pScriptControl.ExecuteStatement "baseValue = obj." & path
getJsonObjectValue = pScriptControl.Run("getBaseValue")
End Function
Public Function getJsonArrayValue(index, key As String)
Dim qt As String
qt = """"
If InStr(key, ".") > 0 Then
arr = Split(key, ".")
key = ""
For Each cKey In arr
key = key + "[" & qt & cKey & qt & "]"
Next
Else
key = "[" & qt & key & qt & "]"
End If
Dim statement As String
statement = "arrayValue = rootObj[" & index & "]" & key

pScriptControl.ExecuteStatement statement
getJsonArrayValue = pScriptControl.Run("getValue", index, key)
End Function
Public Property Get ResponseText() As String
ResponseText = pResponseText
End Property
Public Property Get ResponseJson()
ResponseJson = pResponseJson
End Property
Public Property Get ScriptControl() As Object
ScriptControl = pScriptControl
End Property

Приклад використання (від ThisWorkbook):

Sub Example()
Dim j
"clear current range
Range("A2:A1000").ClearContents
"create ajax object
Set j = New Json
"make yql request for json
j.request "https://query.yahooapis.com/v1/public/yql?q=show%20tables&format=json&callback=&diagnostics=true"
"Debug.Print j.ResponseText
"set root of data
Set obj = j.setJsonRoot("query.results.table")
Dim index
"determine the total number of records returned
index = j.getJsonObjectCount
"if you need a field value from the object that is not in the array
"tempValue = j.getJsonObjectValue("query.created")
Dim x As Long
x = 2
If index > 0 Then
For i = 0 To index - 1
"set cell to the value of content field
Range("A" & x).value = j.getJsonArrayValue(i, "content")
x = x + 1
Next
Else
MsgBox "No items found."
End If
End Sub