新手噩梦?其实是你的“导航地图”没拿对
笔者在 N8N大学 社区里潜水多年,发现很多新同学刚上手 n8n 时,都会经历一个“至暗时刻”:明明逻辑跑通了,数据也返回了,但就是不知道怎么把“上一步”的数据,“搬运”到“下一步”的输入框里。
看着满屏的 {{ JSON }},或者那个让人又爱又恨的 $json,是不是感觉像在看天书?别慌,这不是你笨,是 n8n 的数据交互逻辑确实稍微绕了个弯。今天,笔者就带你把 n8n 的 JSON 数据结构和表达式 (Expressions) 彻底盘明白。
这不仅是技术扫盲,更是帮你跨过新手期的“生死坎”。
一、 万物皆对象:n8n 的数据“快递盒”
在 n8n 的世界里,数据不是乱塞的,它是被装在一个个标准的“快递盒”里传递的。这个盒子,就是 JSON。
当你运行一个工作流,每个节点执行完后,都会把结果打包成一个 JSON 对象,传给下一个节点。这个对象通常包含三个核心部分(你可以通过点击节点查看 JSON 选项卡来验证):
$json:这是核心中的核心。它包含了 API 返回的原始数据、Excel 的行数据、Webhook 发来的报文体等。$headers:如果涉及 HTTP 请求,这里存放的是响应头信息。$różni:这部分略显复杂,通常包含节点执行状态、时间戳等元数据。新手阶段,我们 90% 的操作都在跟$json打交道。
笔者提示: 你可以把
$json想象成快递盒里的“主货物”,而$headers是贴在盒子外面的“快递单”。
二、 表达式 (Expressions):你的“自动搬运工”
知道了数据存在 $json 这个“盒子”里,下一步就是怎么把它拿出来。这就是 表达式 的工作。
在 n8n 的任何输入框(如 HTTP Request 的 Body,Set 节点的 Value),只要按下快捷键 Ctrl + Space (Mac 是 Cmd + Space),就会弹出一个“万能菜单”。
表达式的通用语法是:{{ $json.字段名 }} 或 {{ $json["字段名"] }}。
举个最典型的场景:你用 HTTP Request 请求了一个用户列表,返回如下:
{
"code": 200,
"data": {
"users": [
{ "id": 101, "name": "张三" },
{ "id": 102, "name": "李四" }
]
}
}
如果你在下一个节点想引用“张三”这个名字,路径就是:{{ $json.data.users[0].name }}。这就是在 JSON 结构中逐级“钻取”的过程。
三、 新手必懂的几种引用场景
1. 简单的“平级”引用
如果数据是扁平的,比如 {"user": "n8n"},直接在下个节点写 {{ $json.user }} 即可。这是最简单的。
2. 嵌套对象的“钻取”
如果数据是多层嵌套的,比如上面的 users,你需要用点号 . 一层层剥开。如果遇到数组(比如那个中括号 []),你必须指定索引,比如 [0] 取第一个,[1] 取第二个。
避坑点: 如果你不确定数组里到底有几个元素,想全部提取,通常需要配合 Split Out 节点或者 Set 节点来做循环处理,而不是硬写索引。
3. 甚至可以“运算”
表达式不仅能取值,还能做简单的数学计算。比如你想把两个数字相加:
{{ $json.price * $json.quantity }}
这在处理金额计算、数据格式化时非常有用。
四、 笔者的“避坑指南”:为什么我的表达式报错了?
在 N8N大学 的交流群里,这三大坑是高频出现的:
1. 键名包含特殊字符或空格
如果你的 JSON 键名是 First Name(带空格),用点号语法 $json.First Name 是会报错的。这时候必须用中括号语法,并加引号:
正确写法:{{ $json["First Name"] }}
2. 数据类型不匹配
你想做加法,但某个字段其实是字符串格式(比如 "100")。这时候你需要先转换类型:
写法:{{ Number($json.price) + Number($json.tax) }}
3. 找不到字段(Undefined)
这通常是因为你引用的节点路径不对。请务必检查左侧的节点面板,确认你引用的是“上一步”执行成功的节点数据。建议使用 Set 节点来中转数据,这样路径会非常清晰。
五、 进阶技巧:善用 Data Structuring
当你拿到的数据是一坨乱麻(比如 API 返回了一个巨大的 Map 结构),n8n 自带的 JSON 节点其实是你的好帮手。
在 JSON 节点中,你可以选择 Convert to String/JSON,或者使用 Resolve 操作。但更常用的是 Set 节点,通过它你可以重命名字段,或者手动构建一个新的 JSON 结构,让下游节点引用起来更方便。
笔者的建议是:**不要试图让表达式变得太复杂**。如果一个表达式里写了太多层级的钻取,不如在中间加一个 Set 节点,先把需要的数据“拍平”,再传给下一步。这叫“数据预处理”,能极大降低后期维护的难度。
FAQ:新手常问的 3 个问题
Q1: 为什么我在输入框里看不到预览值,只有黄色的变量名?
A: 这是 n8n 的正常现象。黄色代表这是一个表达式。如果你输入的是纯文本,它就是灰色的。点击运行(Test step)后,如果配置正确,黄色框旁边会显示实际抓取到的值。
Q2: $json 和 $item 有什么区别?
A: 简单说,$json 是当前数据项的内容;$item 是获取特定索引的数据项。在简单的单线流程中,$json 足够用了。但在“合并”或“循环”模式下,你可能需要用到 $item(i) 来指定取第几条数据。
Q3: 如果我想引用的字段名是 n8n 的保留字怎么办?
A: 比如字段叫 node 或 json,直接用点号可能会解析混乱。此时请统一使用 {{ $json["node"] }} 这种中括号形式,这是最稳妥的写法。
总结与资源
掌握了 JSON 结构和表达式引用,你就相当于掌握了 n8n 的“语言”。这看起来有点枯燥,但它是通往自动化高手的必经之路。
在 N8N大学,我们始终相信:**只要数据流得通,逻辑再复杂都能拆解**。下次遇到引用问题,试着打开 JSON 面板,对照着层级结构,用 Ctrl + Space 慢慢拼出你的路径吧!
如果你觉得这篇文章帮到了你,欢迎收藏 N8N大学 (n8ndx.com),更多硬核实操指南正在路上。