如何在Zapier Code Zap中用JS将非标准JSON转为合规格式
解决Zapier无法兼容API返回的非标准JSON格式问题
问题背景
API返回的是非标准JSON格式,每行一个独立的JSON对象,示例如下:
{"city":"Warren Township","country":"United States"} {"city":"New York","country":"United States"} {"city":"Stamford","country":"United States"}
而Zapier的Webhook Retrieve Poll触发要求JSON必须是带方括号的数组格式,示例如下:
[{"city":"Warren Township","country":"United States"}, {"city":"New York","country":"United States"}, {"city":"Stamford","country":"United States"}]
使用默认Webhook触发时,报错:We couldn't find an entry。
失败的尝试
尝试用Code by Zapier转换数据时,报错:Error while retrieving: You must return a single object or array of objects,错误代码如下:
return fetch(https://api.iterable.com/api/export/data.json?dataTypeName=emailSend&range=Yesterday, { mode: 'cors', headers: { 'x-api-key': 'xxxxxxxxxxxxxxxxxxxxxxx', 'User-Agent' : 'My-App', 'Accept': '*/*', }, }) .then(response => response.text()) .catch(error => console.log('Error while fetching:', error)) callback(error, "output") let xStr = response.text(); let obj = JSON.parse(xStr); output = {obj};
注:这段代码存在多处问题:异步Promise处理逻辑混乱,
callback调用时机错误,重复调用response.text()(该方法仅能调用一次),且未将结果整理为Zapier要求的格式。
正确解决方案
通过以下JavaScript代码成功完成格式转换,适配Zapier的要求:
let url = 'https://api.iterable.com/api/export/data.json?dataTypeName=emailOpen&range=Today&onlyFields=email&onlyFields=createdAt&onlyFields=templateId&onlyFields=messageId&onlyFields=campaigniD&onlyFields=contentID' let iterableData = 'undefined' let response = await fetch(url, { method: "GET", headers: { 'Api-Key': '----------redacted----------------', }, }); iterableData = await response.text() // 将每行对象转换为合法JSON数组格式 iterableData = iterableData.replace(/\}/g, "},") iterableData = "[" + iterableData.slice(0, -2) + "]" let iterableJSON = JSON.parse(iterableData) output = {iterableJSON}
代码说明:
- 使用
await处理异步请求,确保完整获取响应文本; - 通过正则替换将每个对象末尾的
}替换为},,为数组格式做准备; - 在首尾添加方括号,将非标准格式包裹为合法的JSON数组;
- 解析转换后的字符串为JSON对象,并赋值给
output,符合Zapier对返回值的要求。
内容的提问来源于stack exchange,提问作者asg
相关产品推荐
相关产品推荐

