VBA解析JSON出现运行时错误'9'(下标越界)求助
问题概述
本地运行正常的VBA JSON解析脚本,在另一台机器执行时,于ParseArr(key$)函数的Select Case token(p)语句触发运行时错误'9':下标越界。
核心原因分析
Tokenize函数解析异常
token数组由Tokenize(JSON)生成,若该函数未正确处理目标JSON(比如特殊字符、不规范空格/换行、编码差异),会导致生成的token数组长度不足,循环中p递增后超出数组下标范围。循环无边界检查
ParseArr和ParseObj的Do Loop未添加p是否超出token数组上限的判断,一旦JSON格式不规范或Tokenize解析错误,p会持续递增直至越界。重复分支逻辑失效
ParseObj函数中存在两个重复的Case "{":分支,第二个分支永远不会被执行,导致空对象{}的处理逻辑失效,可能引发后续p的错误递增。
修复与排查步骤
补全Tokenize函数并验证
你未提供Tokenize函数代码,这是问题关键。需确保该函数能正确解析所有合法JSON:- 处理字符串中的转义字符(如
\"、\\) - 兼容不同的空格、换行符
- 正确识别JSON的结构符号(
{、}、[、]、:、,)
- 处理字符串中的转义字符(如
修复重复的Case分支
修改ParseObj中的重复Case "{":,整合逻辑:Case "{": If token(p + 1) = "}" Then p = p + 1 dic.Add key, "null" Else ParseObj key End If删除原第一个单独的
Case "{": ParseObj key分支添加循环边界检查
在ParseArr和ParseObj的循环开头添加越界判断,避免p超出数组范围:
以ParseArr为例:Function ParseArr(key$) Dim e& Do p = p + 1 ' 添加边界检查 If p > UBound(token) Then Exit Do Select Case token(p) ' 原分支逻辑... End Select Loop End FunctionParseObj函数同理添加该检查。验证目标JSON的合法性
将触发错误的JSON拿到本地测试,确认是否存在语法错误(如缺少闭合符号、不规范字符串),或编码问题(如非UTF-8编码导致解析乱码)。
内容的提问来源于stack exchange,提问作者Don

