GitHub Action Slack通知JSON无效及toJSON使用问题求助
解决Slack API通知的JSON无效问题
问题本质
你碰到的两个问题都是JSON格式合法性导致的:
- PR标题里的�是无效UTF-8字符,JSON强制要求字符串必须是合法UTF-8编码;
- 嵌套场景的引号报错,是手动拼接JSON时没正确转义特殊字符搞出来的。
具体解决办法
1. 清理无效UTF-8字符
别只靠toJSON,先把原始文本里的无效字符清掉:
// 直接移除替换字符�,也可以换成空格之类的合法字符 function cleanInvalidChars(str) { return str.replace(/\uFFFD/g, ''); } const cleanedTitle = cleanInvalidChars(prTitle);
2. 永远别手动拼JSON,用序列化工具
这是解决引号嵌套的核心——直接造对象,再用JSON.stringify()自动处理转义,不管多少层嵌套都不会出问题。
错误示范(别这么干):
// 手动拼字符串,引号一嵌套就炸 const payload = `{ "text": "PR标题:"${cleanedTitle}"已更新" }`;
正确示范:
// 先构造JavaScript对象,想怎么嵌套怎么嵌套 const payloadObj = { text: `PR标题:"${cleanedTitle}"已更新`, attachments: [ { fallback: `PR更新:${cleanedTitle}`, fields: [{ title: "标题", value: cleanedTitle, short: false }] } ] }; // 序列化自动转义所有特殊字符,生成合法JSON const payload = JSON.stringify(payloadObj);
3. 别碰单引号的歪路子
Slack API只认双引号的合法JSON,单引号写的JSON是无效的,用单引号代替双引号只会添乱,绝对不能这么做。
额外小技巧
- 发请求前可以用
JSON.parse(payload)自检一下,提前发现格式问题; - 要是用Slack官方SDK(比如
@slack/web-api),直接传对象就行,SDK会帮你搞定序列化和字符处理,省好多事。
内容的提问来源于stack exchange,提问作者madid
相关产品推荐
相关产品推荐

