用 1 个 VBA 文件解析 JSON:从安装到避开 10001 报错的完整指南
【免费下载链接】VBA-JSONJSON conversion and parsing for VBA项目地址: https://gitcode.com/gh_mirrors/vb/VBA-JSON
VBA 里没有现成的 JSON 解析库,手写的字符串拼接代码在遇到嵌套和转义时几乎必然出错。VBA-JSON把这件事压缩成仓库根目录的JsonConverter.bas一个文件——1123 行代码,提供ParseJson(JSON 字符串变对象)和ConvertToJson(对象变 JSON 字符串)两个入口函数,Excel、Access 等 Office 应用在 Windows 和 Mac 上通用。
一个文件替你挡掉了什么
手写解析的难点不在于第一层取值,而在于后面所有情况:嵌套对象、嵌套数组、转义字符\"、字符串里的换行和空格、键名带冒号或空格。这些JsonConverter.bas里都处理好了,解析结果直接落到 VBA 最熟悉的两种结构上:对象变Dictionary,数组变Collection。
| 场景 | 方案 |
|---|---|
| 只在 Windows 上用 | 加对Microsoft Scripting Runtime的引用 |
| Windows + Mac 通用 | 引入 VBA-Dictionary 项目的Dictionary.cls类模块 |
为什么必须有这一步?因为ParseJson返回的Dictionary/Collection不是 VBA 内置类型,总得有人提供——这是整个库唯一的"外援"。
VBA-JSON 怎么装进项目:3 步
git clone https://gitcode.com/gh_mirrors/vb/VBA-JSON- VBA 编辑器(
Alt + F11)里,在工程上右键 → 导入文件 → 选JsonConverter.bas - 按上表补一个依赖
- 编译一次,不报错就装好了
依赖没配好时,Dictionary这个类型会直接在编译期暴露出来,比运行期报错好排查得多。
一个完整任务:解析、修改、生成
下面这段直接贴进模块跑,从接口返回的 JSON 到改完写回,一条线走完:
Dim Json As Object ' ParseJson:JSON 字符串 → Dictionary / Collection Set Json = JsonConverter.ParseJson("{""城市"":""上海"",""温度"":26.5,""预警"":[""雷电"",""大风""]}") Debug.Print Json("温度") ' 26.5 Debug.Print Json("预警")(2) ' 大风(Collection 下标从 1 开始,见下节) Json("湿度") = 0.72 ' 直接加字段 Json("预警").Add "暴雨" ' 直接往数组里加元素 Debug.Print JsonConverter.ConvertToJson(Json) ' 紧凑:{"城市":"上海",...} Debug.Print JsonConverter.ConvertToJson(Json, Whitespace:=2) ' 缩进 2 格,结构一目了然输入不合法时,ParseJson抛出错误码10001,例如传入Howdy!会得到:
Error parsing JSON: Howdy! ^ Expecting '{' or '['箭头指着它卡住的位置——它期待 JSON 以{(对象)或[(数组)开头。键后缺冒号时报Expecting ':',值不合法时报Expecting 'STRING', 'NUMBER', null, true, false, '{', or '[',都是 10001,箭头直接定位到出错的那一列,不用逐字猜。
2 个反直觉的默认行为,先知道再上手
1. 超过 15 位的纯数字,默认返回 String。VBA 的Double只能可靠保存 15 位有效数字,订单号、卡号一旦超位,末尾几位会被悄悄截断成...4560。所以库的默认策略是:超过 15 位的纯数字一律当字符串返回,宁可类型"不纯"也不丢数据。仓库specs/Specs.bas里有一组 30 位数字的断言专门锁死这个行为。如果你确实要数字类型:
JsonConverter.JsonOptions.UseDoubleForLargeNumbers = True ' 默认 False,会丢精度,慎用2. 数组下标从 1 开始。Collection的规矩,Json("b")(2)取的是第二个元素,不是 JSON 里下标为 2 的那个。写循环时记住1 To .Count。
另外两个全局开关都在JsonOptions上,按需打开即可:AllowUnquotedKeys(允许不带引号的键名,标准 JSON 不允许)、EscapeSolidus(输出时把/转义成\/),默认都是False。
不跑测试怎么自查:2 分钟肉眼验证
在 VBA 编辑器建个模块,跑这一段:
Sub 验证VBAJSON() On Error GoTo 失败 Dim r As Object Set r = JsonConverter.ParseJson("{""id"":""123456789012345678"",""list"":[1,2]}") Debug.Print TypeName(r("id")), r("list")(1) ' 期望:String 和 1 Debug.Print JsonConverter.ConvertToJson(r, Whitespace:=2) Exit Sub 失败: Debug.Print Err.Number ' 期望 0;如果是 10001,说明 JSON 本身不合法 End Sub看三个结果:id 的类型是String(精度保护在工作)、列表第一个元素是1(下标从 1 起)、最后打印出带缩进的多行 JSON。全对上,你的环境就通了。
想系统性地确认,specs/Specs.bas里写了 460 行、30 组左右断言,覆盖嵌套数组、转义单引号、null、日期转 ISO 格式,打开specs/VBA-JSON - Specs.xlsm跑一遍,全绿即环境无误。
一个文件装下 VBA 的整个 JSON 世界——去把specs/下的测试跑一次,看 30 组断言全绿,今天就可以拿真实接口的数据试手了。
【免费下载链接】VBA-JSONJSON conversion and parsing for VBA项目地址: https://gitcode.com/gh_mirrors/vb/VBA-JSON
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考