Разбор данных JSON в лист Excel - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь извлечь данные JSON в таблицу Excel в виде таблицы, используя следующий код.

Sub test()
    Dim httpObject As Object
    Set httpObject = CreateObject("MSXML2.XMLHTTP")

    sURL = "https://www.nseindia.com/live_market/dynaContent/live_watch/stock_watch/foSecStockWatch.json"

    sRequest = sURL
    httpObject.Open "GET", sRequest, False
    httpObject.send
    sGetResult = httpObject.responseText

    Dim oJSON As Object
    Set oJSON = JsonConverter.ParseJson(sGetResult)

    i = 2

    For Each sItem In oJSON
        dItemString = oJSON(sItem)("symbol")
        sItemValue = oJSON(sItem)("open")
        vItemValue = oJSON(sItem)("high")
        xItemValue = oJSON(sItem)("low")
        Cells(i, 1) = dItemString
        Cells(i, 2) = sItemValue
        Cells(i, 3) = vItemValue
        Cells(i, 4) = xItemValue
        i = i + 1
    Next
End Sub

Однако я получаю следующую ошибку!

enter image description here

enter image description here

Почему я получаю эту ошибку?Пожалуйста, сообщите

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Прежде всего вам необходимо изучить структуру ответа JSON, используя любой онлайн-просмотрщик JSON (например, http://jsonviewer.stack.hu/),, где вы можете видеть, что ваш объект JSON содержит массив data и несколько свойств со скалярными значениями.:

JSON

Далее, в массиве data есть объекты, каждый из которых содержит некоторые свойства, которые можно заполнить в строках на листе:

data array

Вот пример VBA, показывающий, как эти значения могут быть получены. Импорт JSON.bas модуль в проект VBAдля обработки JSON.

Option Explicit

Sub Test()

    Dim sJSONString As String
    Dim vJSON
    Dim sState As String
    Dim aData()
    Dim aHeader()
    Dim vResult

    ' Retrieve JSON content
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.nseindia.com/live_market/dynaContent/live_watch/stock_watch/foSecStockWatch.json", True
        .send
        Do Until .readyState = 4: DoEvents: Loop
        sJSONString = .responseText
    End With
    ' Parse JSON sample
    JSON.Parse sJSONString, vJSON, sState
    If sState = "Error" Then MsgBox "Invalid JSON": End
    ' Convert raw JSON to 2d array and output to worksheet #1
    JSON.ToArray vJSON("data"), aData, aHeader
    With ThisWorkbook.Sheets(1)
        .Cells.Delete
        .Cells.WrapText = False
        OutputArray .Cells(1, 1), aHeader
        Output2DArray .Cells(2, 1), aData
        .Columns.AutoFit
    End With
    MsgBox "Completed"

End Sub

Sub OutputArray(oDstRng As Range, aCells As Variant)

    With oDstRng
        .Parent.Select
        With .Resize(1, UBound(aCells) - LBound(aCells) + 1)
            .NumberFormat = "@"
            .Value = aCells
        End With
    End With

End Sub

Sub Output2DArray(oDstRng As Range, aCells As Variant)

    With oDstRng
        .Parent.Select
        With .Resize( _
                UBound(aCells, 1) - LBound(aCells, 1) + 1, _
                UBound(aCells, 2) - LBound(aCells, 2) + 1)
            .NumberFormat = "@"
            .Value = aCells
        End With
    End With

End Sub

Вывод для массива data для меня выглядит следующим образом:

output

Кстати, аналогичный подход применяется в других ответах .

0 голосов
/ 14 декабря 2018

Я вставил ваш код в тестовый модуль, а затем импортировал JsonConverter в качестве дополнительного модуля в мою пустую книгу.Вероятно, ошибка, которую вы получаете, потому что вам нужно добавить библиотеку «Microsoft Scripting Runtime» в вашу книгу.В VBE перейдите в меню Инструменты -> Ссылки ..., затем прокрутите вниз и поставьте галочку рядом с библиотекой.После этого ваш код проанализировал JSON без проблем.

Однако в вашем цикле произошел сбой.

I весьма рекомендуем использоватьOption Explicit в верхней части вашего модуля.Типы переменных, которые, по вашему мнению, вы используете (поскольку я вижу, что вы пытаетесь использовать венгерскую нотацию), не обязательно являются типами фактических данных.Мое предложение состоит в том, чтобы использовать описательные имена для переменных, чтобы избежать путаницы.Кроме того, вы должны зацикливаться на структуре oJSON("data") (кстати, Collection).Вот мои предложения, реализованные на практике:

Option Explicit

Sub test()
    Dim httpObject As Object
    Set httpObject = CreateObject("MSXML2.XMLHTTP")

    Dim sURL As String
    sURL = "https://www.nseindia.com/live_market/dynaContent/" & _
           "live_watch/stock_watch/foSecStockWatch.json"

    Dim sRequest As String
    sRequest = sURL
    httpObject.Open "GET", sRequest, False
    httpObject.send

    Dim sGetResult As String
    sGetResult = httpObject.responseText

    Dim oJSON As Object
    Set oJSON = JsonConverter.ParseJson(sGetResult)

    Dim i As Long
    i = 2

    Dim dataItem As Variant
    Dim symbolName As String
    Dim openValue As Double
    Dim highValue As Double
    Dim lowValue As Variant
    For Each dataItem In oJSON("data")
        symbolName = dataItem("symbol")
        openValue = dataItem("open")
        highValue = dataItem("high")
        lowValue = dataItem("low")
        Cells(i, 1) = symbolName
        Cells(i, 2) = openValue
        Cells(i, 3) = highValue
        Cells(i, 4) = lowValue
        i = i + 1
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...