如何在VBS中访问createObject("htmlfile")返回的JSON对象
VBScript访问JScript解析的JSON数组元素的解决方案
你当前用htmlfile对象的JScript引擎解析JSON后,能获取数组的length属性,但无法直接用VBScript语法访问数组元素,核心原因是JScript数组和VBScript数组的对象模型不兼容——JScript数组不是VBScript可直接遍历/索引的SafeArray类型,需要做适配处理。
以下是两种可行的解决方法:
方法1:给JScript数组添加VBScript可调用的获取方法
在解析JSON的JScript代码中,给数组注入getItem方法,让VBScript能通过该方法索引元素:
Function parseJson(strJson) Dim html, window Set html = WScript.CreateObject("htmlfile") Set window = html.parentWindow ' 注入JScript代码:解析JSON并给数组添加getItem方法 window.execScript "var json = " & strJson & "; " & _ "// 给一维数组添加getItem方法" & _ "function addGetItem(arr) { " & _ " arr.getItem = function(index) { " & _ " var item = this[index]; " & _ " // 如果是嵌套数组,递归添加方法" & _ " if (Array.isArray(item)) addGetItem(item); " & _ " return item; " & _ " }; " & _ "} " & _ "addGetItem(json.columns); " & _ "addGetItem(json.data);", "JScript" Set parseJson = window.json End Function ' 调用示例 Dim JSON, jsonText jsonText = "{""columns"":[""b_summary"",""end_fy"",""id"",""isin"",""market"",""name"",""num_employees"",""sector"",""ticker""],""data"":[[""Microsoft Corp is a technology company. "",6,59265,""US5949181045"",1,""MICROSOFT CORP"",166475,101003,""MSFT""]]}" Set JSON = ParseJson(jsonText) WScript.Echo JSON.columns.length & " columns" WScript.Echo JSON.data.length & " rows" ' 访问数组元素 WScript.Echo "第二个列名:" & JSON.columns.getItem(1) ' 输出end_fy WScript.Echo "第一行第一列数据:" & JSON.data.getItem(0).getItem(0) ' 输出Microsoft Corp...
方法2:将JScript数组转换为VBScript兼容数组
利用JScript的VBArray对象,把JScript数组转换为VBScript可直接索引的SafeArray:
Function parseJson(strJson) Dim html, window Set html = WScript.CreateObject("htmlfile") Set window = html.parentWindow ' 注入JScript代码:解析JSON并转换为VBScript数组 window.execScript "var json = " & strJson & "; " & _ "// 递归转换嵌套数组为VBScript数组" & _ "function toVBSArray(arr) { " & _ " var vbArr = new VBArray(arr).toArray(); " & _ " for (var i = 0; i < vbArr.length; i++) { " & _ " if (Array.isArray(vbArr[i])) { " & _ " vbArr[i] = toVBSArray(vbArr[i]); " & _ " } " & _ " } " & _ " return vbArr; " & _ "} " & _ "json.columns = toVBSArray(json.columns); " & _ "json.data = toVBSArray(json.data);", "JScript" Set parseJson = window.json End Function ' 调用示例 Dim JSON, jsonText jsonText = "{""columns"":[""b_summary"",""end_fy"",""id"",""isin"",""market"",""name"",""num_employees"",""sector"",""ticker""],""data"":[[""Microsoft Corp is a technology company. "",6,59265,""US5949181045"",1,""MICROSOFT CORP"",166475,101003,""MSFT""]]}" Set JSON = ParseJson(jsonText) ' VBScript数组用UBound获取最大索引,元素数量为UBound+1 WScript.Echo UBound(JSON.columns) + 1 & " columns" WScript.Echo UBound(JSON.data) + 1 & " rows" ' 直接用VBScript数组语法访问 WScript.Echo "第二个列名:" & JSON.columns(1) ' 输出end_fy WScript.Echo "第一行第一列数据:" & JSON.data(0)(0) ' 输出Microsoft Corp...
两种方法都能解决你的问题,方法1保留JScript数组的原生特性,方法2更贴合VBScript的使用习惯,可根据需求选择。
内容的提问来源于stack exchange,提问作者alfadog67
相关产品推荐
相关产品推荐

