场景导入:那个让你抓狂的 "Unexpected token u"
兄弟们,搞自动化最崩溃的瞬间是啥?对笔者来说,不是服务器宕机,也不是 API 限流,而是那句经典的报错:Unexpected token u in JSON at position 0。
这通常发生在一个节点需要 JSON 对象,但传过来的却是字符串的时候。比如,你从 HTTP Request 拿到一个 API 响应,想用 Set 节点提取某个字段,结果死活提取不出来,或者直接报错。为什么?因为你拿到的是 "{"name": "n8n"}" 这种字符串,而不是 {name: "n8n"} 这种对象。
在 N8N大学,我们不写那些“正确但没用”的废话。今天学长就手把手教你,如何在 n8n 里丝滑地搞定 JSON Object(对象)和 String(字符串)的互转,彻底治好你的格式焦虑。
核心实操:掏出你的 "瑞士军刀"—— Code 节点
虽然 n8n 里有很多节点都能处理数据,但在处理格式转换这种“脏活累活”时,最强的工具永远是 Code 节点。它就像一把瑞士军刀,能让你用 JavaScript 把数据揉碎了再重塑。
笔者见过很多新手试图用复杂的表达式(Expression)去硬磕,结果把自己绕晕。听我的,直接上 Code 节点,清晰明了。
步骤一:JSON Object 转 String (序列化)
场景:你从数据库或 API 获取了一堆结构化数据(对象),需要把它作为纯文本发给钉钉机器人,或者存入一个只支持文本的字段。
操作指南:
- 在你的工作流中,添加一个 Code 节点。
- 连接上你的上游节点(比如 HTTP Request 或 Set)。
- 在 Code 节点的“JavaScript Code”框里,输入以下代码:
// 假设上游数据在 $json 中
const originalData = $json;
// 使用 JSON.stringify 将对象转换为字符串
const jsonString = JSON.stringify(originalData);
// 输出结果,必须返回一个对象
return { json: { stringData: jsonString } };
这样一来,无论上游传过来多么复杂的对象,输出端都会得到一个干净的 stringData 字符串。
步骤二:String 转 JSON Object (反序列化)
场景:这是最高频的踩坑点。你收到一个 Webhook,里面夹带的数据是字符串格式的 JSON;或者上游节点不小心把对象变成了字符串。你需要把它转回对象,才能在后续节点中正确读取字段。
操作指南:
同样使用 Code 节点,代码如下:
// 假设上游传来的字符串字段名叫 "dirtyString"
const rawString = $json.dirtyString;
let parsedObject;
try {
// 尝试解析字符串
parsedObject = JSON.parse(rawString);
} catch (error) {
// 如果解析失败(比如字符串格式不对),为了不让整个工作流断掉,建议返回原值或错误提示
console.error("JSON 解析失败:", error);
parsedObject = { error: "格式转换失败", original: rawString };
}
return { json: parsedObject };
学长提醒: 这里一定要加 try...catch。在自动化流程中,数据脏一点是常态,如果不加捕获,一个坏掉的字符串就能让你整个工作流“红灯”挂掉。
进阶技巧:其实不用写代码?
有些同学可能会问:“学长,我写代码有点虚,有没有纯 UI 的解法?”
还真有。在 n8n 的 Set 节点(或者 Function Item 节点)中,利用 n8n 的 表达式(Expression) 也能完成简单的转换。
- 转 String: 在 Set 节点的 Value 栏,直接写
{{ JSON.stringify($json.yourObject) }}。 - 转 Object: 在 Set 节点的 Value 栏,直接写
{{ JSON.parse($json.yourString) }}。
这种方法适合简单的一对一转换。但如果你需要对数据进行清洗、过滤或者嵌套循环,老老实实回到 Code 节点,那是更优解。
避坑指南:90% 的报错都源于此
笔者在 N8N大学 混了这么多年,见过太多人在格式转换上栽跟头。这里分享两个最致命的细节:
- 隐藏的空格和双引号: 有时候你以为拿到的是 JSON String,其实它外面还套了一层单引号,或者首尾有空格。在解析前,先用
trim()去除空格是个好习惯。 - 混淆了“键”和“值”: 在 Code 节点输出时,一定要搞清楚你要返回的是什么。如果你返回
{ json: { data: $json } },下游节点读取时要用{{ $json.data.name }}。如果你直接返回{ json: $json },下游就直接读{{ $json.name }}。结构搞乱了,数据就全乱了。
FAQ 问答
Q1: 为什么我的 Code 节点输出了,但下游节点读不到数据?
A: 检查 Code 节点的返回格式。必须是 { json: { ...你的数据... } } 这种结构。如果你返回的是 { key: 'value' },n8n 是不认的,它会认为你没有输出 JSON 数据。
Q2: 如果我要转换的是数组格式的字符串,方法一样吗?
A: 完全一样。JSON.stringify() 和 JSON.parse() 对数组和对象是一视同仁的。数组本质也是一种对象。
Q3: 有没有比 Code 节点更快的转换方式?
A: 如果是简单的 Object 转 String,建议直接在下游节点的“表达式”里处理,这样可以减少一个节点的开销,执行效率更高。但复杂的逻辑处理,还是必须用 Code 节点。
总结与资源
数据格式转换是 n8n 自动化里的“基本功”。掌握好 JSON.stringify() 和 JSON.parse() 这两个原生方法,配合 Code 节点,你就能解决 99% 的格式不匹配问题。
在 N8N大学,我们始终相信:搞技术不是为了炫技,而是为了把复杂的事情变简单。希望这篇干货能帮你解决实际问题。
如果你在实操中遇到了更奇葩的格式问题,欢迎在评论区留言,学长在线帮你排忧解难!