ServiceNow中JavaScript调用REST API传递数组参数报错如何解决?
ServiceNow 环境JavaScript调用REST API数组入参问题解决方案
问题根因总述
你遇到的三个问题本质都是原始数据处理逻辑错误导致的格式异常:
- stringify后数组仅含一个带逗号的字符串:说明你操作的原始数组本身就只有1个逗号拼接的字符串元素
- 出现嵌套数组:是你将split生成的数组又插入了另一个空数组导致
- 出现多余转义符:是手动拼接带引号的字符串后,再次执行序列化自动转义了引号导致
正确实现步骤
1. 生成符合要求的一维字符串数组
直接对原始逗号拼接字符串执行split操作,不要将返回结果嵌套到其他数组中:
// 你的原始数据源,格式为单个逗号拼接的字符串 const rawStr = "Acid Reflux,Anemia,Asthma,Atrial Fibrillation,Cancer"; // 直接接收split返回的一维数组即可,不要执行arr.push(splitResult)这类操作 const targetArr = rawStr.split(','); // 校验:此时打印targetArr.length应为6,和你预期的元素数量一致 gs.info('数组元素个数:' + targetArr.length);
2. 构造REST请求直接传入数组
使用ServiceNow标准REST请求工具时,直接将上述数组作为参数值传入请求体,统一执行序列化即可,无需手动处理引号:
try { const restMsg = new sn_ws.RESTMessageV2(); restMsg.setHttpMethod('POST'); restMsg.setEndpoint('替换为你的API实际地址'); restMsg.setRequestHeader('Content-Type', 'application/json'); // 构造请求体对象,直接把生成好的一维数组赋值给对应参数 const reqBody = { // 替换为接口实际要求的参数名 "medical_conditions": targetArr }; // 统一序列化整个请求体,不会生成多余转义符 restMsg.setRequestBody(JSON.stringify(reqBody)); const response = restMsg.execute(); const statusCode = response.getStatusCode(); const resBody = response.getBody(); gs.info('请求响应:' + resBody); } catch (e) { gs.error('接口请求错误:' + e.getMessage()); }
避坑提示
- 不要手动通过replace等方法给元素拼接引号,JSON.stringify会自动处理字符串元素的引号包裹
- 序列化前可通过
gs.info(JSON.stringify(targetArr))打印数组,确认输出为["Acid Reflux","Anemia","Asthma","Atrial Fibrillation","Cancer"]即符合要求 - 如果调用的是ServiceNow自带的脚本REST API,也可以直接把数组传入请求参数,无需序列化,平台会自动处理格式
内容的提问来源于stack exchange,提问作者mjdoolit
相关产品推荐
相关产品推荐

