VBA解析NSE接口返回JSON报类型不匹配 如何提取指定字段值
错误原因
- NSE India接口有反爬校验,无请求头的GET请求会返回错误页面,不是合法JSON,解析时触发类型不匹配错误
- 你写的JSON字段路径不符合实际数据结构:
filtered.data是一维对象数组,每个数组元素包含CE(看涨期权)、PE(看跌期权)、strikePrice(行权价)属性,不存在你写的二维索引(1)(2)的结构
修复后的完整代码
Option Explicit Sub nse5() Dim req As New MSXML2.XMLHTTP60 Dim url As String Dim json As Object Dim i As Long url = "https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY" With req .Open "GET", url, False ' 添加请求头模拟浏览器请求,避免被反爬拦截 .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" .setRequestHeader "Accept", "application/json, text/plain, */*" .setRequestHeader "Accept-Language", "en-US,en;q=0.9" .send ' 先校验请求是否成功 If .Status <> 200 Then Debug.Print "请求失败,状态码:" & .Status Exit Sub End If Set json = JsonConverter.ParseJson(.responseText) End With ' 示例:打印第一条期权数据的行权价、看涨持仓、看跌持仓 Debug.Print "=====第一条期权数据=====" Debug.Print "行权价:" & json("filtered")("data")(1)("strikePrice") Debug.Print "看涨持仓量(CE OI):" & json("filtered")("data")(1)("CE")("openInterest") Debug.Print "看跌持仓量(PE OI):" & json("filtered")("data")(1)("PE")("openInterest") ' 如果需要遍历所有数据可以用以下循环 ' For i = 1 To json("filtered")("data").Count ' Debug.Print "行权价" & i & ":" & json("filtered")("data")(i)("strikePrice") ' Debug.Print "看涨持仓:" & json("filtered")("data")(i)("CE")("openInterest") ' Debug.Print "看跌持仓:" & json("filtered")("data")(i)("PE")("openInterest") ' Next i End Sub
前置依赖配置
- 提前安装VBA-JSON解析库
- 打开VBA编辑器,点击「工具-引用」,勾选以下两项:
- Microsoft Scripting Runtime
- Microsoft XML, v6.0
排查提示
如果仍出现解析错误,可以在.send后添加Debug.Print req.responseText,查看返回内容是否为合法JSON,确认是否被反爬拦截。
内容的提问来源于stack exchange,提问作者AAdi
相关产品推荐
相关产品推荐

