使用Google Apps Script的UrlFetchApp调用API时遇JSON类型转换错误
org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject错误 这个错误的核心逻辑很清晰:你的代码里把API返回的JSON数组(JSONArray)当成了JSON对象(JSONObject)来处理,要么是请求格式不符合API要求导致返回了异常响应,要么是后续解析处理时搞错了数据类型。结合你的代码,我们一步步拆解问题:
1. 先排查请求Payload的格式问题
看你的代码,EventData是一个数组:
var EventData=[{ "StartDate": "07/22/2019 09:00", "EndDate": "07/29/2019 17:00", "VenueId": [12312312] }];
然后你直接把这个数组转成JSON字符串作为请求体发送:
"payload":JSON.stringify(EventData)
绝大多数POST API要求接收JSON对象而非数组作为请求体(比如会要求把数据包裹在{"data": ...}这类结构里)。如果API期望的是对象,但你发送了数组,它很可能返回格式异常的数组响应,进而触发类型转换错误。
建议你先核对目标API的文档,确认请求体的正确格式。比如如果API要求对象格式,你需要把数组包裹到对象中:
var EventData = { "events": [{ "StartDate": "07/22/2019 09:00", "EndDate": "07/29/2019 17:00", "VenueId": [12312312] }] };
再重新生成Payload发送请求。
2. 检查响应的解析与后续处理逻辑
假设API确实返回的是JSON数组(比如多个场馆数据的集合),那JSON.parse(resp.getContentText())得到的RespObj就是一个数组。如果你后续代码里尝试像访问对象属性一样操作它(比如RespObj.venueName),必然会触发类型转换错误。
你可以先把响应内容打印出来,明确它的真实结构:
var respText = resp.getContentText(); console.log("API响应内容:", respText); var RespObj = JSON.parse(respText);
如果打印结果是数组(比如[{"venueId":123,...}, {...}]),那你需要用数组的方式处理它,比如遍历:
for (var i = 0; i < RespObj.length; i++) { var venue = RespObj[i]; console.log("场馆ID:", venue.VenueId); }
3. 排查API返回的错误响应
如果请求格式不正确,API可能会返回包含错误信息的数组(而非预期的正常对象),这也会导致这个错误。所以第一步打印响应内容非常关键,能帮你快速定位是请求格式问题,还是响应处理逻辑问题。
总结一下排查步骤:
- 打印API响应内容,确认它的实际结构是数组还是对象
- 对照API文档,校验请求体格式是否符合要求
- 根据响应的真实结构调整后续代码:数组就用数组的方式操作,对象就用对象的方式访问属性
内容的提问来源于stack exchange,提问作者Mukundha CHar

