跳转到内容

核心心智模型 · Item / JSON / 迭代

第 1 章 · 第 4 节

本节是 n8n 学习者最容易忽视、却最关键的一节。理解这里讲的三件套——Item / JSON / 迭代——之后你看任何 workflow 都能”读懂它在做什么”。

n8n 里的数据,永远是”一个由 JSON 对象组成的数组”——每个对象叫一个 Item,每个节点对数组里的每一个 Item 各自执行一次。

这一句话密度有点大,我们拆开看。

打开任意一个执行过的节点,看它的输出 tab,你会看到类似这样的结构:

📤 node-output.json
[ { "name": "Alice", "age": 30 }, { "name": "Bob", "age": 25 }, { "name": "Carol", "age": 28 } ]

整体是一个数组([...])——这是 n8n 数据的”标准包装”。
每个元素是一个对象({...})——这就是一个 Item

上面这个节点的输出有 3 个 Items

最关键的一点:下一个节点接到这个数组后,默认会对数组里的每一项各自执行一次

举个例子,如果下一个节点是 “HTTP Request”(去 API 查这个人),它会发 3 次请求

🔄 iteration.txt

# HTTP Request 节点 · URL 配置为 …/users/{{ $json.name }} ▶ run 1: GET /users/Alice → { … } ▶ run 2: GET /users/Bob → { … } ▶ run 3: GET /users/Carol → { … } → 输出:仍是 3 个 Items 的数组

这是 n8n 跟传统编程最大的区别:你不需要写 for 循环——节点自动迭代。

$json 是 “当前正在处理的那个 Item”

Section titled “$json 是 “当前正在处理的那个 Item””

回到刚才的 {{ $json.name }}。这个表达式在节点对每个 Item 处理时,$json 自动变成那个 Item 的内容:

迭代第几次$json$json.name 求值为
第 1 次{ "name": "Alice", "age": 30 }"Alice"
第 2 次{ "name": "Bob", "age": 25 }"Bob"
第 3 次{ "name": "Carol", "age": 28 }"Carol"

这就是 n8n 表达式的灵魂——$json 不是固定值,它跟着迭代变化。

引用”上一个节点”和”任意节点”

Section titled “引用”上一个节点”和”任意节点””

$json 只引用正前方节点。如果你想引用更早的节点,用 $('NodeName')

🔍 references.txt
# 引用最近一个节点(默认) {{ $json.name }} # 引用名为 “Get Users” 的节点 {{ $('Get Users').item.json.name }} # 引用 “Get Users” 的所有 items {{ $('Get Users').all() }} # 引用 “Get Users” 的第一个 item {{ $('Get Users').first().json.name }}

这套引用语法在第 3 部分会展开讲。这里先有个概念就行。

不是所有节点都输出多 Item。比如:

  • Manual Trigger → 永远输出 1 个空 Item[{}]
  • HTTP Request GET 单个资源 → 1 个 Item
  • Google Sheets 读 100 行 → 100 个 Items
  • Webhook 收到一次请求 → 1 个 Item

你的工作流逻辑通常是:先从某处拿”一堆 Items”,然后让后续节点对每个迭代处理。

设想一个真实场景:

📊 real-flow.txt

Node A · Google Sheets:   // 读出一张 “客户” 表 → 输出 50 个 Items   [{ “email”: “a@x.com”, “name”: “Alice” }, … 49 more] Node B · Send Email:   // To 字段:{{ $json.email }}   // Subject 字段:Hello {{ $json.name }}   ▶ 自动发送 50 次邮件

你没写一行循环代码——50 个 Items 自动让 Node B 跑了 50 次。这就是 n8n 的核心抽象魅力。

  • n8n 数据 = JSON 对象数组,每个对象是一个 Item
  • 节点默认 对每个 Item 各自执行一次(自动迭代)
  • $json 指代”当前正在处理的那个 Item”
  • 引用其他节点:$('NodeName').first().json.field
  • 没有 for 循环——迭代是 n8n 的内建行为

下一节聊聊一次”执行”到底发生了什么 —— Execution 机制