JsonConverter, объект ошибки требуется, когда ключ не существует - PullRequest
0 голосов
/ 09 декабря 2018

Я использую connect VBA с API, и иногда JSON, полученный из API, имеет динамические ключи, например.как это

json =[{"oeange":"good",}{"banana":{"color":"yellow"}},{"cat":"grumpy"}]

и иногда как это

json = [{"oeange":"good",}{"banana":null},{"cat":"grumpy"}]

Я пытался

for each item in json
 if item("banana").Exists("color") Then
    do something
End If

Next

, это всегда дает требуемый объект ошибки.я выгляжу так, как будто всегда ищу («цвет»)

Вопрос в том, как мне получить данные «ноль» или «желтый цвет» от json.

1 Ответ

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

Вы можете написать рекурсивную подпрограмму, которая будет проверять, что каждая структура находится в JSON и обрабатывать соответствующим образом.Кроме того, вам нужно сместить позицию конечного "," в начале, чтобы он фактически разделял элементы в JSON.

Так что в А1 и А2 у меня есть следующее:

[{"oeange":"good"},{"banana":{"color":"yellow"}},{"cat":"grumpy"}]
[{"oeange":"good"},{"banana":null},{"cat":"grumpy"}]

VBA:

Option Explicit
Public r As Long
Public Sub GetInfoFromSheet()
    Dim json As Object, jsonSource(), i As Long, ws As Worksheet, arr() As String
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    jsonSource = Application.Transpose(ws.Range("A1:A2").Value)

    For i = LBound(jsonSource) To UBound(jsonSource)
      Set json = JsonConverter.ParseJson(jsonSource(i))
      EmptyJSON json
    Next i
End Sub

Public Sub EmptyJSON(ByVal json As Object)
    Dim key As Variant, item As Object
    Select Case TypeName(json)
    Case "Dictionary"
        For Each key In json
            Select Case TypeName(json(key))
            Case "Dictionary"
                EmptyJSON json(key)
            Case Else
                r = r + 1
                With ThisWorkbook.Worksheets("Sheet1")
                    .Cells(r, 2) = key
                    .Cells(r, 3) = json(key)
                End With
            End Select
        Next
    Case "Collection"
        For Each item In json
            EmptyJSON item
        Next
    End Select
End Sub

Выход:

image

...