Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >VBA分析多个值

VBA分析多个值
EN

Stack Overflow用户
提问于 2020-03-03 07:05:25
回答 1查看 371关注 0票数 1

我在使用带有多个值键的JSON转换器时遇到了问题。

我有为导航JSON树而编写的普通递归例程,但是这里有一个简单的JSON解析示例,我似乎无法工作。

看看这个VBA转换软件,它是非常棒和快速的。

环境: Windows 7/ Access 2016 /专用局域网(无互联网)

下面是代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Option Compare Database
Option Explicit

Sub testparse()
Dim js As String, i As Long, jo As Object, item As Variant
Dim keys(), vals()

' fails on this string
js = "{ !Category!: !Famous Pets!," & _
  "!code!: [!a!,!b!,!c!] }"            ' string with multiple values

' with the following string, this works
js = "{ !Category!: !Famous Pets!," & _
  "    !code!: !singlecodevalue! }"

js = Replace(js, "!", Chr(34)) ' replace ! with quotes

Debug.Print " js = " & js
Set jo = JsonConverter.ParseJson(js) ' returns object with json elements
i = 0
ReDim keys(1 To jo.Count)
ReDim vals(1 To jo.Count)

Debug.Print " Number keys found at top level " & jo.Count
For Each item In jo
    i = i + 1
    keys(i) = item
    vals(i) = jo(item)
    Next item

For i = 1 To jo.Count
    Debug.Print "key " & keys(i) & " = " & vals(i)
    Next i

End Sub
EN

回答 1

Stack Overflow用户

发布于 2020-03-03 08:51:02

对于在JSON对象中运行时遇到的每一项,您必须确定所处理的是什么--特别是如果您不提前知道数组中有多少项!如果您有一个带有数组内部集合的复合JSON结构,那么它就会变得更加棘手。

底线是,您必须检查从JSON对象中提取的每一项,并在访问JSON对象之前找出它是什么。JSON对象的顶层(假设使用JsonConverter)总是一个Dictionary。因此,您可以指望通过顶级字典的键循环:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Dim json As Dictionary
Set json = JsonConverter.ParseJson(someJsonString)

Dim topLevelKey As String
For Each topLevelKey In json
    Dim item As Variant
    Debug.Print topLevelKey & " = " & item
Next topLevelKey 

问题是,item并不总是一个简单的字符串。它可以是值(String)、数组(Collection)或组(Dictionary)。将这个答案看作是一个很好的参考。

基本上,这意味着您必须在使用每个item之前检查它。所以你可以这样检查它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Select Case TypeName(item)
    Case "Collection"
        '--- loop through the item as a Collection
    Case "Dictionary"
        '--- loop through the item as a Dictionary
    Case Else
        '--- the item is a value of some type (String, Boolean, etc)
End Select

在这里的示例中,我创建了一个名为ParseItem的子程序,它以这种方式检查每个项。将原始代码重新工作到下面的示例中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Option Explicit

Sub testparse()
    Dim js As String, i As Long, jo As Object, item As Variant
    Dim keys(), vals()

    ' fails on this string
    js = "{ !Category!: !Famous Pets!," & _
         "!code!: [!a!,!b!,!c!] }"               ' string with multiple values

    ' with the following string, this works
    '    js = "{ !Category!: !Famous Pets!," & _
    '         "    !code!: !singlecodevalue! }"

    '--- compound example
    '    js = "{ !Category!: !Famous Pets!,!code!: [!a!,!b!,{!c! : { !c1! : !1!, !c2!:!2!}}] }"

    js = Replace(js, "!", Chr(34))               ' replace ! with quotes

    Debug.Print "----------------------"
    Debug.Print "js = " & js
    Set jo = JsonConverter.ParseJson(js)         ' returns object with json elements
    ParseDictionary 1, "root", jo
End Sub

Private Sub ParseCollection(ByVal level As Long, _
                            ByVal key As String, _
                            ByRef jsonCollection As Variant)
    Dim item As Variant
    For Each item In jsonCollection
        ParseItem level, key, item
    Next item
End Sub

Private Sub ParseDictionary(ByVal level As Long, _
                            ByVal key As String, _
                            ByRef jsonDictionary As Variant)
    Dim dictKey As Variant
    For Each dictKey In jsonDictionary
        ParseItem level, dictKey, jsonDictionary(dictKey)
    Next dictKey
End Sub

Private Sub ParseItem(ByVal level As Long, _
                      ByVal key As String, _
                      ByRef item As Variant)
    Select Case TypeName(item)
    Case "Collection"
        Debug.Print Format(level + 1, "00 ") & key & " (collection)"
        ParseCollection (level + 1), key, item
    Case "Dictionary"
        Debug.Print Format(level + 1, "00 ") & key & " (dictionary)"
        ParseDictionary (level + 1), key, item
    Case Else
        Debug.Print Format(level, "00 ") & key & " = " & item
    End Select
End Sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60510128

复制
相关文章
flutter的列表下拉刷新
flutter的列表下拉刷新需要借助一个组件来实现,这个组件的名字是RefreshIndicator,直译过来就是刷新指示灯。
挥刀北上
2021/01/07
4.8K0
flutter的列表下拉刷新
模板代码 - 列表和下拉刷新
摘要总结:本篇文章主要介绍了如何使用ViewStub和ViewStubCompat实现多布局,以便在不同的屏幕尺寸和分辨率下达到较好的展示效果。同时,还介绍了如何使用ViewStub和ViewStubCompat实现内边距和圆角,以及自定义属性在布局中的使用。
用户1172465
2018/01/05
2.9K0
【Flutter】ListView 列表高级功能 ( RefreshIndicator 下拉刷新组件 )
使用 Flutter 提供的 RefreshIndicator 组件 , 可以实现下拉刷新的功能 ;
韩曙亮
2023/03/29
2K0
【Flutter】ListView 列表高级功能 ( RefreshIndicator 下拉刷新组件 )
微信小程序列表数据的局部刷新
本文由来源 17,由 system_mush 整理编辑,其版权均为 17 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。
Java架构师必看
2020/04/10
2.6K0
RecyclerView 刷新列表数据的 notifyDataSetChanged() 为什么是昂贵的?
当列表数据变更时,调用 notifyDataSetChanged() 是最省事的。无需关心变更的细节,一股脑统统刷一遍就完事了。但这样做也是最昂贵的。读完这一篇源码走查就知道为啥它这么昂贵了。
Rouse
2021/05/28
3.4K0
RecyclerView 刷新列表数据的 notifyDataSetChanged() 为什么是昂贵的?
​借助云开发数据库实现小程序列表上拉刷新功能丨云开发101
上一期101专栏中,我们介绍了如何借助云开发数据库实现小程序的列表触底自动加载功能,相对应的,小程序列表上拉刷新又该如何实现呢?本期专栏就来为大家解答。
腾讯云开发TCB
2019/10/08
6040
微信小程序----列表下拉刷新上拉加载(MUI下拉刷新和上拉加载更多)
效果图 原理 利用微信小程序的onPullDownRefresh函数(下拉刷新监听函数)和onReachBottom函数(上拉加载监听函数)监听页面的下拉和上拉动态,从而对页面数据进行修改! 页
Rattenking
2021/02/01
1.9K0
微信小程序----列表下拉刷新上拉加载(MUI下拉刷新和上拉加载更多)
MariaDB数据库刷新权限表命令
当授权或者修改用户权限时,往往不会马上生效的这是因为数据库没有马上去更新权限相关的表,而是在内存中所以一般都会使用更新权限表,来实现马上更新
用户9006224
2022/12/21
1K0
Java常用数据库列表
MySQL是一种开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,现在由Oracle公司负责维护和支持。MySQL是最流行的数据库之一,被广泛用于各种应用程序和网站开发。 MySQL具有以下特点:
ha_lydms
2023/08/10
5520
Java常用数据库列表
JS/JQuery页面刷新、局部刷新
//div的局部刷新 $(".dl").load(location.href+" .dl"); //全页面的刷新方法 window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象(用于框架) opener.location.reload()刷新父窗口对象(用于单开窗口) top.location.reload()刷新最顶端对象(用于多开窗口)
小语雀网
2022/05/06
5.8K0
php案例之数据库选择列表
作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主 文章目录 cyg.php check.php 效果: ---- cyg.php <style> body{ background:#ccc; }</style> <b>数据库选择列表<b><br> <form action="check.php" method="POST">//提交到check.php <select name="database" size="10"> <option value="0"
贵哥的编程之路
2022/09/23
6260
php案例之数据库选择列表
数据库Mongodb-用户权限列表
Mongodb用户权限列表 read 允许用户读取指定数据库 readWrite 允许用户读写指定数据库 dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile userAdmin 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限 readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限 r
cwl_java
2021/08/30
7520
EasyDSS前端界面在页面缩小时内置列表仍需手动刷新的优化
RTMP协议的视频平台EasyDSS除了直播外,还支持点播,转码、上传一体化设计,使音视频资源转码后可立即面向互联网进行发布,在线上教育领域已经能够成熟落地。在开发以及功能的更新过程中,EasyDSS内还运用了很多其他层面的开发技巧,我们也会不定期在博客更新,欢迎大家了解测试。
TSINGSEE青犀视频
2021/09/07
4090
Power BI 异步刷新-查询刷新历史与手动停止刷新
有朋友在评论区提出,如果是手动刷新或者计划刷新,是否知道了requestid就同样可以手动停止呢?
陈学谦
2022/04/08
4.6K0
Power BI 异步刷新-查询刷新历史与手动停止刷新
刷新.NET
.NET Core 发布的那一天起,它在完成自我刷新的过程,一切为了适应未来,云原生。不仅仅跨平台那么简单。
李明成
2020/02/12
6210
UI 刷新
与屏幕刷新相关的有很多,比如刷新流程,屏幕缓存,周期刷新,vsync信号,SurfaceFlinger。
Yif
2020/04/25
2.1K0
5.5 PowerBI技巧-定时刷新与增量刷新
加入 PowerBI自己学 知识星球 可以:下载源文件,边学边练;遇到问题,提问交流,有问必答。
PowerBI自己学_轻松
2025/02/26
1690
5.5 PowerBI技巧-定时刷新与增量刷新
下拉刷新
getMeasuredHeight():获取测量完的高度,只要在onMeasure方法执行完,就可以用
六月的雨
2022/01/17
2.2K0
金蝶KIS&K3助记码SQL数据库批量刷新
金蝶KIS&K3助记码SQL数据库批量刷新 用的次数不多,就没有写入存储过程或者触发里面了,可以自行实现。 第一步选择对应账套的数据库,执行下面的命令,这个是一个函数。 go if exists (select * from sysobjects where name='fun_getPY' and xtype='Fn') begin drop function fun_getPY end go create function fun_getPY(@str nvarchar(4000)) re
landv
2018/06/26
7660
uni-app下拉刷新加载刷新数据
onPullDownRefresh 监听该页面用户下拉刷新事件 需要在 pages.json 里 开启 enablePullDownRefresh
达达前端
2019/10/14
7.4K0

相似问题

每晚刷新postgres数据库

20

在数据库刷新期间保留现有登录

10

SSMS数据库节点刷新导致恢复失败

10

如何在刷新数据库后保存并还原权限

10

通过每日数据库刷新撤销Server登录访问

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文