n8n中$json与$items()的关键区别:实际应用解析(2026-07-04)
如果你刚开始使用n8n,或者已经在用它搭建自动化流程,你很可能遇到过两个看似相似、实则截然不同的变量:$json 和 $items()。搞混它们,轻则数据传错,重则整个工作流崩溃。今天我们就用实际案例,把这两个“兄弟”彻底分清楚。
为什么容易混淆?
在n8n的表达式编辑器里,$json 和 $items() 都能让你访问数据,但它们的“视角”完全不同:
$json:代表当前正在处理的那一个数据项。你可以把它想象成“我在看眼前这一行记录”。$items():代表前一个节点输出的所有数据项的数组。你可以把它想象成“我在看整个表格的所有行”。
听起来简单,但实际应用中,很多人会在这里“翻车”。
核心区别:一个看“点”,一个看“面”
1. 作用范围不同
$json 只存在于循环处理(如“SplitInBatches”)或单条数据处理的上下文中。它指向当前这条数据。
$items() 则可以在任何节点中使用,并且必须指定是哪个节点输出的数据(例如 $items("NodeName"))。
2. 返回值不同
$json返回一个对象(Object)$items()返回一个数组(Array)
这意味着:你不能直接对 $items() 进行 .property 这样的对象属性访问,而必须先索引(如 $items("Node")[0].json.field)。
实战案例:一个用户数据清洗流程
假设你有一个“获取用户列表”的节点(API节点),返回了5条用户记录。
场景A:用$json逐一处理每条用户
在后续的“Set”节点中,使用表达式 {{ $json.name }},n8n会自动为每一条用户记录执行一次,生成对应的输出。
输出结果(5条记录):
第一条用户 → { name: "张三" }
第二条用户 → { name: "李四" }
...
场景B:用$items()批量统计
如果在同一节点中使用 {{ $items("获取用户列表").length }},你会得到5,即所有记录的总数。
如果你写 {{ $items("获取用户列表")[0].json.name }},你只会拿到第一条用户的“张三”,因为你是从数组中取第一个元素。
关键提醒:在代码节点(Code Node)中,$input.all() 等价于 $items(),而 $input.first().json 等价于 $json。
实用建议:如何正确选择?
| 使用场景 | 推荐变量 | 原因 |
|---|---|---|
| 逐条修改数据字段 | $json |
自动循环,简洁安全 |
| 获取前一个节点的记录总数 | $items("NodeName").length |
数组的length属性 |
| 在代码节点中做复杂计算 | $items() |
可以遍历所有数据 |
| 合并多条数据成一条 | $items() |
需要整体操作数组 |
常见错误示例
错误写法(在非循环节点中直接写{{ $json.field }}):
- 前提:你是在一个只接收单条数据的节点里
- 结果:n8n会报错
Cannot read property 'field' of undefined
正确写法:
- 使用
{{ $items("PreviousNode")[0].json.field }} - 或者确保该节点处于循环模式下
行动号召:现在就动手验证
打开你的n8n工作台,新建一个最简单的测试流程:
- 添加一个“Manual Trigger”节点
- 添加一个“Set”节点,手动输入两条示例数据(比如 {id:1, name:"测试A"}, {id:2, name:"测试B"})
- 添加一个“Code”节点,在其中分别输出
$json和$items("Set")的数据类型和内容
对比输出结果,你会立刻理解两者的差异。记住:数据管道里,$json 是游标,$items() 是整本书。 掌握这个区别,你的n8n工作流将更稳定、更高效。
免责声明:本文内容基于n8n 1.x版本的官方文档和实际使用经验编写。n8n版本更新可能导致部分函数行为变化,请以最新官方文档为准。文中示例仅作教学参考,实际生产环境请充分测试。作者不对因使用本文信息导致的任何损失负责。