VBA JSON читать суб массив, как читать - PullRequest
0 голосов
/ 10 ноября 2018

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 в ячейке.

1 Ответ

0 голосов
/ 10 ноября 2018

Хочу заметить, что вы уже отредактировали JSON и вопрос несколько:

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

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

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

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

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

image

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:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...