如何在VBA Excel中以良好格式显示我的JSON对象

如何在VBA Excel中以良好格式显示我的JSON对象,json,excel,vba,Json,Excel,Vba,我知道当Json很简单的时候,我会在cell Excel中显示我的解析Json,但现在我有了字符串、对象和数组,我有点迷路了。。 我的json如下所示: [ { "name": null, "type": null, "actions": [], "screen": null, "container": null, "sysid": 5, "uftitem": null

我知道当Json很简单的时候,我会在cell Excel中显示我的解析Json,但现在我有了字符串、对象和数组,我有点迷路了。。 我的json如下所示:

[
    {
        "name": null,
        "type": null,
        "actions": [],
        "screen": null,
        "container": null,
        "sysid": 5,
        "uftitem": null
    },
    {
        "name": null,
        "type": null,
        "actions": [],
        "screen": null,
        "container": null,
        "sysid": 6,
        "uftitem": null
    },
    {
        "name": "UTProject5",
        "type": "type",
        "actions": [
            {
                "name": "UTProject",
                "description": "UTProject",
                "pattern": "UTProject",
                "isCheck": true,
                "sysid": 1,
                "uftaction": {
                    "sysid_uftAction": 2,
                    "code": "code uft",
                    "maxTime": 10,
                    "nbCycle": 20
                }
            },
            {
                "name": "UTProject2",
                "description": "UTProject",
                "pattern": "UTProject",
                "isCheck": true,
                "sysid": 3,
                "uftaction": {
                    "sysid_uftAction": 4,
                    "code": "code uft",
                    "maxTime": 10,
                    "nbCycle": 20
                }
            }
        ],
        "screen": {
            "name": null,
            "type": null,
            "actions": [],
            "screen": null,
            "container": null,
            "sysid": 5,
            "uftitem": null
        },
        "container": {
            "name": null,
            "type": null,
            "actions": [],
            "screen": null,
            "container": null,
            "sysid": 6,
            "uftitem": null
        },
        "sysid": 7,
        "uftitem": {
            "code": "code",
            "parentCode": "tooooz",
            "sysid": 8
        }
    },
    {
        "name": "UTProject6",
        "type": "type",
        "actions": [
            {
                "name": "UTProject",
                "description": "UTProject",
                "pattern": "UTProject",
                "isCheck": true,
                "sysid": 1,
                "uftaction": {
                    "sysid_uftAction": 2,
                    "code": "code uft",
                    "maxTime": 10,
                    "nbCycle": 20
                }
            },
            {
                "name": "UTProject2",
                "description": "UTProject",
                "pattern": "UTProject",
                "isCheck": true,
                "sysid": 3,
                "uftaction": {
                    "sysid_uftAction": 4,
                    "code": "code uft",
                    "maxTime": 10,
                    "nbCycle": 20
                }
            }
        ],
        "screen": {
            "name": null,
            "type": null,
            "actions": [],
            "screen": null,
            "container": null,
            "sysid": 5,
            "uftitem": null
        },
        "container": {
            "name": null,
            "type": null,
            "actions": [],
            "screen": null,
            "container": null,
            "sysid": 6,
            "uftitem": null
        },
        "sysid": 9,
        "uftitem": {
            "code": null,
            "parentCode": null,
            "sysid": 10
        }
    }
]
我想访问我想要的并在单元格中显示它,但我不知道在数组和对象中的访问权限

谢谢大家

概述:

您可以使用以下代码清空整个内容,该代码使用:

注:

我正在从工作表中读取JSON字符串,并通过JSONConverter存储在对象中。初始对象是一个集合。我使用TypeName函数*循环该集合和其中的每个嵌套级别,以确定在每个级别存储哪些对象。然后,我使用selectcase适当地处理这些对象

更有效的方法是设计一个可重用的类来处理这个问题。我已经看到了一些其他问题,在哪里可以做到这一点

*实际上更健壮

示例JSON

立即窗口的示例代码输出:

您可以通过将Debug.Print语句替换为工作表范围的赋值来选择写入单元格的方式

VBA:

我们还可以看到,在名称不为null的字典中,actions包含另一个字典集合。如前所述,我们有[后跟{

我们可以看到每个内部字典都有名称、描述等键。我们还可以看到它们的值具有不同的数据类型

观察JSON结构中的操作,您可以看到这些操作使用示例字典:

字符串名称:UTProject 字符串说明:UTProject 字符串模式:UTProject 布尔isCheck:true 双系统ID:1 Dictionary uftacon'keys of==>sysid\u uftacon:2,code:code-uft,maxTime:10,nbCycle:20 因此,我们可以使用selectcase通过使用TypeName进行测试来处理数据类型

对于基本布尔型、字符串型和双精度数据类型,我们可以使用键简单地打印它们

json(i)("actions")(j)("isCheck")
这将是True或False的布尔结果。i和j是外部和内部集合循环中当前位置的索引

对于字典uftaction,我们可以循环其键:

For Each key2 In json(i)("actions")(j)(key).keys 
    Debug.Print "actions " & key & " " & key2 & " " & json(i)("actions")(j)(key)(key2)
Next key2
当然,您可以使用密钥的名称进行访问,而不必在末尾对密钥进行循环,例如:

json(i)("actions")(j)(key)("maxTime")
在整个过程中,您可以通过索引而不是循环访问特定位置,这样i和j将直接替换为一个数值,key、key2等可以替换为任何给定key的实际文本字符串

希望这能给你更多的洞察力

VBA:

概述:

您可以使用以下代码清空整个内容,该代码使用:

注:

我正在从工作表中读取JSON字符串,并通过JSONConverter存储在对象中。初始对象是一个集合。我使用TypeName函数*循环该集合和其中的每个嵌套级别,以确定在每个级别存储哪些对象。然后使用Select Case适当地处理这些对象

更有效的方法是设计一个可重用的类来处理这个问题。我已经看到了一些其他的问题,在哪里可以做到这一点

*实际上更健壮

示例JSON

立即窗口的示例代码输出:

您可以通过将Debug.Print语句替换为工作表范围的赋值来选择写入单元格的方式

VBA:

我们还可以看到,在名称不为null的字典中,actions包含另一个字典集合

我们可以看到每个内部字典都有名称、描述等键。我们还可以看到它们的值具有不同的数据类型

观察JSON结构中的操作,您可以看到这些操作使用示例字典:

字符串名称:UTProject 字符串说明:UTProject 字符串模式:UTProject 布尔isCheck:true 双系统ID:1 Dictionary uftacon'keys of==>sysid\u uftacon:2,code:code-uft,maxTime:10,nbCycle:20 因此,我们可以使用selectcase通过使用TypeName进行测试来处理数据类型

对于基本布尔型、字符串型和双精度数据类型,我们可以使用键简单地打印它们

json(i)("actions")(j)("isCheck")
这将是True或False的布尔结果。i和j是外部和内部集合循环中当前位置的索引

对于字典uftaction,我们可以循环其键:

For Each key2 In json(i)("actions")(j)(key).keys 
    Debug.Print "actions " & key & " " & key2 & " " & json(i)("actions")(j)(key)(key2)
Next key2
当然,您可以使用密钥的名称进行访问,而不必在末尾对密钥进行循环,例如:

json(i)("actions")(j)(key)("maxTime")
在整个过程中,您可以通过索引而不是循环访问特定位置,这样i和j将直接替换为一个数值,key、key2等可以替换为任何给定key的实际文本字符串

希望这能给你更多的洞察力

VBA:


请看下面的示例。将模块导入VBA项目以进行JSON处理

选项显式 附属的 测验 将字符串作为字符串 Dim vJSON 将字符串设置为Dim 暗阿达塔 暗淡的领头人 迪姆·弗雷苏特 '从文件C:\Test\sample.JSON读取JSON样本 sJSONString=ReadTextFileC:\Test\sample.json,0 '解析JSON示例 解析sJSONString、vJSON、sState 如果sState=错误,则 MsgBox无效JSON 终止 如果结束 '将原始JSON转换为2d数组并输出到工作表1 JSON.ToArray vJSON,aData,aHeader 用床单1 .Cells.Delete .Cells.WrapText=False 输出阵列,1号,1号,A区 Output2DArray.Cells2,1,aData .Columns.AutoFit 以 '展平JSON 展平vJSON,vResult '将扁平JSON转换为二维数组并输出到工作表2 JSON.ToArray vResult,aData,a负责人 附页2 .Cells.Delete .Cells.WrapText=False 输出阵列,1号,1号,A区 Output2DArray.Cells2,1,aData .Columns.AutoFit 以 MsgBox已完成 端接头 子输出阵列作为范围,aCells作为变型 使用oDstRng .Parent.Select 使用.Resize1,UBoundaCells-LBoundaCells+1 .NumberFormat=@ .Value=aCells 以 以 端接头 子输出2DRARRAYODSTRNG作为范围,aCells作为变型 使用oDstRng .Parent.Select 使用。调整大小_ UBoundaCells,1-LBoundaCells,1+1_ UBoundaCells,2-LBoundaCells,2+1 .NumberFormat=@ .Value=aCells 以 以 端接头 函数readTextFilePath作为字符串,lFormat作为字符串 'lFormat-2-系统默认值,-1-Unicode,0-ASCII 使用CreateObjectScripting.FileSystemObject.OpenTextFilePath,1,False,lFormat ReadTextFile= 如果不是.AtEndOfStream,则ReadTextFile=.ReadAll 关 以 端函数
顺便说一句,采用了类似的方法。

看看下面的例子。将模块导入VBA项目以进行JSON处理

选项显式 子测试 将字符串作为字符串 Dim vJSON 将状态设置为字符串 暗阿达塔 暗淡的领头人 迪姆·弗雷苏特 '从文件C:\Test\sample.JSON读取JSON样本 sJSONString=ReadTextFileC:\Test\sample.json,0 '解析JSON示例 解析sJSONString、vJSON、sState 如果sState=错误,则 MsgBox无效JSON 终止 如果结束 '将原始JSON转换为2d数组并输出到工作表1 JSON.ToArray vJSON,aData,aHeader 用床单1 .Cells.Delete .Cells.WrapText=False 输出阵列,1号,1号,A区 Output2DArray.Cells2,1,aData .Columns.AutoFit 以 '展平JSON 展平vJSON,vResult '将扁平JSON转换为二维数组并输出到工作表2 JSON.ToArray vResult,aData,a负责人 附页2 .Cells.Delete .Cells.WrapText=False 输出阵列,1号,1号,A区 Output2DArray.Cells2,1,aData .Columns.AutoFit 以 MsgBox已完成 端接头 子输出阵列作为范围,aCells作为变型 使用oDstRng .Parent.Select 使用.Resize1,UBoundaCells-LBoundaCells+1 .NumberFormat=@ .Value=aCells 以 以 端接头 子输出2DRARRAYODSTRNG作为范围,aCells作为变型 使用oDstRng .Parent.Select 使用。调整大小_ UBoundaCells,1-LBoundaCells,1+1_ UBoundaCells,2-LBoundaCells,2+1 .NumberFormat=@ .Value=aCells 以 以 端接头 函数readTextFilePath作为字符串,lFormat作为字符串 'lFormat-2-系统默认值,-1-Unicode,0-ASCII 使用CreateObjectScripting.FileSystemObject.OpenTextFilePath,1,False,lFormat ReadTextFile= 如果不是.AtEndOfStream,则ReadTextFile=.ReadAll 关 以 端函数
顺便说一句,采用了类似的方法。

Nice post。非常彻底,而且VBA+JSON的资源非常有限,像这样的东西对manyNice post很有用。非常彻底,而且VBA+JSON的资源非常有限,这样的东西对很多人都很有用