Vba json читать подмассив, как читать

API, использующий данные ниже json

[{
"Id":"8",
"Date":"12/11/2018",


"readings":[{"Id":"61","DailyLogBookID":"8","Substation":"MS-1","LoadMax":"898","LoadMin":"9898","VoltageMax":"98","VoltageMin":"98","FrequencyMax":"988","FrequencyMin":"9898","PFMax":"988","PFMin":"989","PowerDip":"9898","Remarks":"9898"},

{"Id":"62","DailyLogBookID":"8","Substation":"MS-2","LoadMax":"9889","LoadMin":"98","VoltageMax":"98","VoltageMin":"889","FrequencyMax":"9898","FrequencyMin":"98","PFMax":"98","PFMin":"98","PowerDip":"98","Remarks":"98"}  
]}]

/*************VBA Code************/

Sub CallChildDate(id As String) 
Dim http As Object, JSON As Object, i, j As Integer 
Set http = CreateObject("MSXML2.XMLHTTP") 
Dim strUrl As String 
http.Open "GET", id, False 
http.send 
Set JSON = ParseJson(http.responseText) 
i = 1 

For Each item In JSON
Sheets(1).Cells(i, 1).Value = item("Id") 
Sheets(1).Cells(i, 2).Value = item("Date")
i = i + 1 
Next

End Sub

Как получить это выше "показаний" данных присваивается в значении ячейки. как получить данные массива "чтения" для каждого с помощью assn в ячейке.

Что ты уже сделал? Хорошее место для начала здесь: github.com/VBA-tools/VBA-JSON

Tim Williams 10.11.2018 07:30

Я назначил выше значение json присвоить переменную "JSON" для каждого элемента в JSON для i = от 1 до 10 листов (1) .Cells (i, 1) .Value = Item ("чтения") (i) ("Id") Далее я Далее, но не работает, массив sub json, как его получить.

R saravanan 10.11.2018 07:44

Если у вас есть код, отредактируйте свой вопрос, чтобы добавить его. Код в комментариях не очень читается. «Не работает» тоже требует пояснений - это ошибка? Если да, то какую ошибку вы получите?

Tim Williams 10.11.2018 07:46

Привет, измени мои вопросы

R saravanan 10.11.2018 08:08

должно быть проще подключиться к файлу JSON с помощью Excel Power Query support.office.com/en-us/article/…

Slai 10.11.2018 09:44
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
5
162
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я отмечаю, что вы отредактировали JSON и вопрос:

Из вашего предыдущего вопроса: вы были почти у цели. Ниже я читаю JSON из файла.

{ означает словарь, поэтому вы получаете доступ по ключу, [ означает коллекцию, поэтому вы получаете доступ по индексу. "" означает строковый литерал, поэтому вы читаете как есть. Я использую Парсер JSON для обработки чтения JSON из файла. После добавления .bas из этой ссылки в свой проект вы затем добавляете ссылку через VBE> Инструменты> Ссылки> Microsoft Scripting Runtime.

Если вы изучите структуру JSON, чтобы увидеть, где находятся id в readings, вы увидите, что исходный объект является коллекцией. readings находится в первом элементе коллекции, которая является словарем. readings - это ключ, который возвращает коллекцию словарей:

Set json = JsonConverter.ParseJson(jsonText)(1)("readings") 

Итак, вы просматриваете набор словарей в приведенном ниже коде, где каждый item является словарем. Вы можете зациклить ключи словаря и получить доступ и использовать ключ (например, id) для каждого словаря в пределах, чтобы получить связанное значение.

Option Explicit

Public Sub ReadValues()
    Dim fso As Object, stream As Object, jsonText As String, item As Object
    Dim json As Object, ws As Worksheet, i As Long
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set stream = fso.OpenTextFile("C:\Users\HarrisQ\Desktop\test.json", ForReading)
    jsonText = stream.ReadAll
    stream.Close

    Set json = JsonConverter.ParseJson(jsonText)(1)("readings") 'Collection of dictionaries

    Dim c As Long, key As Variant, arr(), r As Long

    With ws
        arr() = json(1).keys
        .Cells(1, 1).Resize(1, UBound(arr) + 1) = arr
        r = 2
        For Each item In json
            c = 1
            For Each key In item
                .Cells(r, c).Value = item(key)
                c = c + 1
            Next
            r = r + 1
        Next
    End With
End Sub

С вашим измененным вопросом:

Option Explicit
Public Sub CallChildDate(id As String)
    Dim json As Object, item As Object, ws As Worksheet, i As Long

    Set ws = ThisWorkbook.Worksheets("Sheet1")

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", id, False  '<==Assuming id is actually a URL and not to be concantenated with your former variable strURL.
       .send
       Set json = JsonConverter.ParseJson(.responseText)(1)("readings") 'Collection of dictionaries
    End With

    Dim c As Long, key As Variant, arr(), r As Long

    With ws
        arr() = json(1).keys
        .Cells(1, 1).Resize(1, UBound(arr) + 1) = arr
        r = 2
        For Each item In json
            c = 1
            For Each key In item
                .Cells(r, c).Value = item(key)
                c = c + 1
            Next
            r = r + 1
        Next
    End With
End Sub

Вывод с использованием исходной строки JSON:

Я не работаю в файле json, я работаю с данными api, получаю данные json, ваш код не работает. "ParseJson (jsonText) (1) (" чтения ")" Ошибка.

R saravanan 10.11.2018 10:28

как попасть в подмассив больше, чем список массивов. как работать сейчас.

R saravanan 10.11.2018 10:30

Вы не включили остальную часть своего кода, поэтому мне пришлось прочитать ваш JSON из файла. У вас была бы строка, которая читала бы что-то вроде Set json = JsonConverter.ParseJson (.responseText) (1) ("чтения") или xmlhttpobject.responseText (какая-либо переменная содержит объект xmlhttp при использовании запроса XHR).

QHarr 10.11.2018 10:42
как попасть в подмассив больше, чем список массивов. как работать сейчас что это значит? Мой код записывает все идентификаторы на лист. Чтобы получить каждый элемент во внутренних словарях, просто зациклируйте все ключи.
QHarr 10.11.2018 10:43

Другие вопросы по теме