Вам нужно проверить структуру JSON и написать свой код соответственно.[]
означает коллекцию, которую вы можете For Each
над предметами.{}
означает словарь, который вы можете циклически переключать по клавишам.Синие и зеленые квадраты (на изображении вашего JSON ниже) являются строковыми литералами (ключ, пары значений).
Сначала вы получаете словарь, содержащий смесь пар ключ-значение (например, noChg
,5
);с одним ключом data
, находящимся в наборе внутренних словарей.
jsonObj("symbol")
, если вы проанализировали с ParseJson
и следующиеСинтаксис:
Set jsonObj = JsonConverter.ParseJson(.responseText) '<== dictionary
не удалось бы, так как symbol
является ключом во внутренних словарях в коллекции data
и не доступен напрямую из исходного словаря JSON верхнего уровня.
Вместо этого вам нужно зациклить начальный словарь и выписать ключ, пары значений и проверить, является ли ключ data
.Если ключ data
, вам вместо этого нужно зациклить элементы в коллекции (каждый из которых является словарем) и зациклить ключи этих словарей.
Немного подумал о том, как увеличивать счетчики строк и столбцов, и при первом тестировании внутренних ключей словаря зацикливаться, чтобы получить заголовки только один раз, приведет к аккуратной записи данных на лист.
ПРИМЕЧАНИЕ: Я использую JSONConverter.bas для анализа JSON.После добавления этого в проект я также захожу в VBE> Инструменты> Ссылки и добавляю ссылку на Microsoft Scripting Runtime .
VBA:
Option Explicit
Public Sub GetInfo()
Dim json As Object, item As Object, key As Variant, key2 As Variant, ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.nseindia.com/live_market/dynaContent/live_watch/stock_watch/foSecStockWatch.json", False
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send
Set json = JsonConverter.ParseJson(.responseText) '<== dictionary
End With
Dim r As Long, c As Long, headerRow As Long
For Each key In json '<== Loop initial dictionary
r = r + 1
If key = "data" Then '<==collection of dictionaries
For Each item In json("data")
headerRow = headerRow + 1
c = 1
For Each key2 In item '<== individual dictionary
If headerRow = 1 Then '<== test to write out headers of symbols info only once
ws.Cells(r, c) = key2
ws.Cells(r + 1, c) = item(key2)
Else
ws.Cells(r + 1, c) = item(key2)
End If
c = c + 1
Next
r = r + 1
Next
Else 'string literal key, value pairs
ws.Cells(r, 1) = key: ws.Cells(r, 2) = json(key)
End If
Next
End Sub
Образец данных в листе: