ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 26830|回复: 33

[分享] 纯vba代码解析json格式数据

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2018-11-28 11:26 | 显示全部楼层 |阅读模式
人狠话不多,直接说用法!!!
此方法是外国友人原创的,纯vba/vb代码解析,出处在模块里有体现。
前言:
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:
  • 对象表示为键值对
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

{"a": "Json","b":["1","2"]},其中"a"是键,它的值是"Json","b"也是键,它的值是["1","2"]
看到这里,你是不是有点时曾相识的感觉?
对,你的感觉没错,它跟vba里面的字典(Dictionary)一模一样!!


言归正传:
既然跟vba的字典(Dictionary)一样,那就可以转化为字典来使用吧。(如果不懂vba的字典的用法,请自行不课)
国外友人真就这么做了,这位友人将json中用花括号包围起来的内容转化为字典Dictionary,将方括号包围起来的内容转化为集合(Collection,集合跟数组的用法类似)
画重点
花括号 → vba的字典对象(Dictionary
方括号 → vba的集合对象Collection)
以下讲解的内容附件中都有
先分析我们要解析的json字符串,到json.cn格式化一下
1.jpg
我们发现除了resultList这个key对应的的值是集合(因为是方括号包围的)以外,其他都是字典。
那么,假如我们要获取orderAnalysisTime这个key对应的值2018-11-27T11:38:24怎么写呢
首先用我们需要将json字符串转化成vba可识别的对象
  1. Dim jsonStr As String
  2. Dim jsonObject As New JSON

  3. 'json字符串
  4. jsonStr = Range("A1").Value
  5. '先将json字符串转化为vba的对象
  6. Set dict = jsonObject.parse(jsonStr)
复制代码
此时dict就是vba的一个对象(字典对象,因为开头是用花括号包围的),而我们要的值却在dict字典对象的key为map所对应的值里面,而map所对应的值也是一个字典对象,那么字典对象是怎么根据key访问对应的value,我们就依葫芦画瓢:
  1. Dim jsonStr As String
  2. Dim jsonObject As New JSON

  3. 'json字符串
  4. jsonStr = Range("A1").Value
  5. '先将json字符串转化为vba的对象
  6. Set dict = jsonObject.parse(jsonStr)
  7. '跟访问字典的方式一样,访问map对应值
  8. Set map_dict = dict("map")
  9. '输入orderAnalysisTime对应的值
  10. Debug.Print "orderAnalysisTime的值:" & map_dict("orderAnalysisTime")
复制代码
说到这里,相信很多人已经明白了吧

然后再说说json中方括号里面的内容怎么获取地。上面已经说了,方括号对应的是vba的集合,而集合与数组类似,通过下标访问,那么
  1. Dim jsonStr As String
  2. Dim jsonObject As New JSON

  3. 'json字符串
  4. jsonStr = Range("A1").Value
  5. '先将json字符串转化为vba的对象
  6. Set dict = jsonObject.parse(jsonStr)
  7. '跟访问字典的方式一样,访问map对应值
  8. Set map_dict = dict("map")
  9. '输入orderAnalysisTime对应的值
  10. Debug.Print "orderAnalysisTime的值:" & map_dict("orderAnalysisTime")
  11. '访问resultList对应的数组,在vba中它被转化成了集合Collection
  12. Set resultList_coll = map_dict("resultList")
  13. '输出集合的长度
  14. Debug.Print "resultList_coll集合的长度:" & resultList_coll.Count()
复制代码
现在再看看这个集合里面是什么?是花括号包围的数据!对又用上面的方法解析就OK啦
  1. Sub test()
  2. Dim jsonStr As String
  3. Dim jsonObject As New JSON

  4. 'json字符串
  5. jsonStr = Range("A1").Value
  6. '先将json字符串转化为vba的对象
  7. Set dict = jsonObject.parse(jsonStr)
  8. '跟访问字典的方式一样,访问map对应值
  9. Set map_dict = dict("map")
  10. '输入orderAnalysisTime对应的值
  11. Debug.Print "orderAnalysisTime的值:" & map_dict("orderAnalysisTime")
  12. '访问resultList对应的数组,在vba中它被转化成了集合Collection
  13. Set resultList_coll = map_dict("resultList")
  14. '输出集合的长度
  15. Debug.Print "resultList_coll集合的长度:" & resultList_coll.Count()
  16. '上面的集合长度为1,只包含一个字典对象
  17. Set s_dict = resultList_coll(1)
  18. '遍历字典
  19. Debug.Print "*****************************************************"
  20. Debug.Print "父对象的key", "子对象的key", "子对象的Value"
  21. For Each k_str In s_dict.keys()
  22.     Set temp_dict = s_dict(k_str) 's_dict(k_str)'本身就是一个字典
  23.     For Each k In temp_dict.keys()
  24.         Debug.Print k_str, k, temp_dict(k)
  25.     Next
  26. Next
  27. End Sub
复制代码
2.jpg

此文如果对你又用,请赏个小花花吧,谢谢!




补充内容 (2019-4-29 15:04):
据网友反映,64位office报错,解决方法如下:
Private Function UnsignedAdd(StPart As Long, Incr As Long) As Long
变为:
Private Function UnsignedAdd(Start As LongPtr, Incr As Long) As LongPtr

补充内容 (2019-4-29 15:35):
通用版附件在12楼

json.zip

46.49 KB, 下载次数: 1291

评分

17

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-12-22 00:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
支持64位吗?

TA的精华主题

TA的得分主题

发表于 2018-12-22 08:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
留個名
對於複雜的json 很多時候解不了

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-24 15:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

据铁友回应,64位提示strpar报类型不匹配,还没来得及修复

TA的精华主题

TA的得分主题

发表于 2019-2-6 01:30 | 显示全部楼层
请问,楼主。这个strpar 类型不匹配,要怎么处理?我现在使用这个遇到了问题。在64位系统上。

TA的精华主题

TA的得分主题

发表于 2019-2-7 22:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
写得很好,支持!!!!!!!!

TA的精华主题

TA的得分主题

发表于 2019-3-30 01:44 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-29 15:06 | 显示全部楼层

支持
Private Function UnsignedAdd(StPart As Long, Incr As Long) As Long
变为:
Private Function UnsignedAdd(Start As LongPtr, Incr As Long) As LongPtr

TA的精华主题

TA的得分主题

发表于 2019-4-29 15:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我是来讨说法的 发表于 2019-4-29 15:06
支持
Private Function UnsignedAdd(StPart As Long, Incr As Long) As Long
变为:

那你改一下代码啊,加个VBA7和Win64条件编译

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-29 15:16 | 显示全部楼层
xiaotutu6000 发表于 2019-2-6 01:30
请问,楼主。这个strpar 类型不匹配,要怎么处理?我现在使用这个遇到了问题。在64位系统上。

64位office报错,解决方法如下:
Private Function UnsignedAdd(StPart As Long, Incr As Long) As Long
变为:
Private Function UnsignedAdd(Start As LongPtr, Incr As Long) As LongPtr
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 16:27 , Processed in 0.040725 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表