n8n中$json与$items()的关键区别:实际应用解析(2026-07-04)

如果你刚开始使用n8n,或者已经在用它搭建自动化流程,你很可能遇到过两个看似相似、实则截然不同的变量:$json$items()。搞混它们,轻则数据传错,重则整个工作流崩溃。今天我们就用实际案例,把这两个“兄弟”彻底分清楚。

为什么容易混淆?

在n8n的表达式编辑器里,$json$items() 都能让你访问数据,但它们的“视角”完全不同:

听起来简单,但实际应用中,很多人会在这里“翻车”。

核心区别:一个看“点”,一个看“面”

1. 作用范围不同

$json 只存在于循环处理(如“SplitInBatches”)或单条数据处理的上下文中。它指向当前这条数据。

$items() 则可以在任何节点中使用,并且必须指定是哪个节点输出的数据(例如 $items("NodeName"))。

2. 返回值不同

这意味着:你不能直接对 $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工作台,新建一个最简单的测试流程:

  1. 添加一个“Manual Trigger”节点
  2. 添加一个“Set”节点,手动输入两条示例数据(比如 {id:1, name:"测试A"}, {id:2, name:"测试B"})
  3. 添加一个“Code”节点,在其中分别输出 $json$items("Set") 的数据类型和内容

对比输出结果,你会立刻理解两者的差异。记住:数据管道里,$json 是游标,$items() 是整本书。 掌握这个区别,你的n8n工作流将更稳定、更高效。


免责声明:本文内容基于n8n 1.x版本的官方文档和实际使用经验编写。n8n版本更新可能导致部分函数行为变化,请以最新官方文档为准。文中示例仅作教学参考,实际生产环境请充分测试。作者不对因使用本文信息导致的任何损失负责。