You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA使用JsonConverter解析JSON遍历字典提取label及子值方案咨询

问题原因

你原有代码只判断了组件对象下直接存在values属性的情况,但你提供的JSON里,Favorite color的选项列表是嵌套在data对象下的values字段里,所以原有逻辑遍历不到这部分值。

现有逻辑快速修复方案

调整取值判断逻辑,兼容两种values存储结构即可:

Set JSP = JsonConverter.ParseJson(JSONtxtString)

' 先清空原有下拉选项避免重复
Me.AttributeComBo.Clear
Me.ConditionBox.Clear
Me.CBSubValues.Clear

For Each A In JSP
    If IsObject(JSP(A)) Then
        For Each B In JSP(A)
            ' 可自行加过滤逻辑,比如跳过无label的提交按钮
            If Not IsEmpty(B("label")) Then
                Me.AttributeComBo.AddItem B("label")
                Me.ConditionBox.AddItem B("label")
            End If
            
            If B("type") = "selectboxes" Or B("type") = "select" Then
                Dim valuesList As Object
                Set valuesList = Nothing
                ' 兼容两种values存储位置
                If B.Exists("values") Then
                    Set valuesList = B("values")
                ElseIf B.Exists("data") And B("data").Exists("values") Then
                    Set valuesList = B("data")("values")
                End If
                
                If Not valuesList Is Nothing Then
                    For Each C In valuesList
                        Me.CBSubValues.AddItem C("label")
                    Next C
                End If
            End If
        Next B
    End If
Next A
通用任意JSON全遍历方案

如果需要适配任意结构的JSON提取所有值,可使用递归遍历方法,不受嵌套层级限制:

Sub 递归遍历JSON(obj As Variant, Optional 层级 As Integer = 0)
    Dim key As Variant
    Dim item As Variant
    
    If TypeName(obj) = "Dictionary" Then
        For Each key In obj.Keys
            ' 可自定义提取逻辑,比如遇到label就存入下拉列表
            If key = "label" Then
                Debug.Print String(层级, " ") & "label: " & obj(key)
                ' 需要添加到下拉框就写:Me.对应下拉框名称.AddItem obj(key)
            End If
            
            If IsObject(obj(key)) Then
                递归遍历JSON obj(key), 层级 + 1
            Else
                Debug.Print String(层级, " ") & key & ": " & obj(key)
            End If
        Next
    ElseIf TypeName(obj) = "Collection" Then
        For Each item In obj
            If IsObject(item) Then
                递归遍历JSON item, 层级 + 1
            Else
                Debug.Print String(层级, " ") & item
            End If
        Next
    Else
        Debug.Print String(层级, " ") & obj
    End If
End Sub

调用方式:

Set JSP = JsonConverter.ParseJson(JSONtxtString)
' 直接传入解析后的JSON对象即可完成全量遍历
递归遍历JSON JSP

你只需在递归逻辑对应判断分支里添加自己需要的提取规则,就能适配所有结构的JSON取值需求。


内容的提问来源于stack exchange,提问作者VBAbyMBA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:24:02