【问题标题】:JsonConverter, Error Object Required when key doe not existsJsonConverter, 键不存在时需要的错误对象
【发布时间】:2018-12-09 14:45:59
【问题描述】:

我正在使用将 VBA 与 API 连接,有时从 API 返回的 JSON 具有例如动态密钥。 像这样

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 中获取“null”或“yellow”的数据。

【问题讨论】:

    标签: json vba rest api jsonconverter


    【解决方案1】:

    您可以编写一个递归子程序来测试每个结构在 JSON 中的内容并进行适当处理。此外,您需要在开头移动尾随“,”的位置,以便它实际分隔 JSON 中的项目。

    所以在 A1 和 A2 中我有以下内容:

    [{"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
    

    输出:

    【讨论】:

    • 这很有帮助,但我对 VBA 很陌生。如何将 json(key) 提取到单元格中。我尝试了很多方法。例如,我将 i 放入 EmptyJSON 函数中,但 i 没有增加,即使我在 Debug.Print 键后声明 i=i+1 , , json(key)
    • 请参阅编辑。如有任何其他问题,请随时提出。
    • 我还有一个问题。 Application.Transpose 究竟是做什么的。我试图摆脱它,因为在 Excel 2010 中,当有相当大的数据时,它会引发类型不匹配。我做了一些研究,这是因为 Transpose 无法处理大数据,所以我正在考虑找到一种替代方法,而不是使用 Transpose。非常感谢。
    • 它是生成一个一维数组来循环。否则删除转置,然后你的数组将是二维的,你需要循环第一个维度,即 For i = LBound(jsonSource,1) To UBound(jsonSource,1) : Set json = JsonConverter.ParseJson(jsonSource(i, 1))
    • 不客气 请记住点击答案旁边的接受复选标记。 stackoverflow.com/help/someone-answers
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多