详解n8n数据流中的json格式传递
时间: 2025-08-10 16:01:05 浏览: 7
<think>我们正在详解n8n数据流中的JSON格式传递方式和结构。根据用户要求,需要参考站内引用,但用户提供的引用[1]和[2]似乎与当前问题关联不大。不过,我们可以结合之前回答中关于数据流的部分,以及n8n官方文档知识来详细说明。
n8n工作流中,数据以JSON格式在节点之间传递。每个节点接收来自上一个节点的JSON数据,并输出处理后的JSON数据给下一个节点。下面将详细解释其传递方式和结构。
### 一、JSON数据的基本结构
在n8n中,每个节点处理的数据是一个包含多个条目的数组,每个条目是一个JSON对象。每个条目包含两个主要部分:
1. **json**:存储结构化数据(键值对)
2. **binary**:存储二进制数据(如图片、文件等)
一个典型的数据条目结构如下:
```json
[
{
"json": {
"id": 1,
"name": "Alice",
"email": "[email protected]"
},
"binary": {}
},
{
"json": {
"id": 2,
"name": "Bob",
"email": "[email protected]"
},
"binary": {}
}
]
```
### 二、JSON数据的传递方式
1. **单条目传递**
大多数节点每次处理一个条目(即数组中的一个对象),并将处理后的条目传递给下一个节点。例如:
```mermaid
graph LR
A[节点1] -->|传递单个条目| B[节点2]
```
2. **批量传递**
部分节点(如`SplitInBatches`)支持将数据分批处理,每批包含多个条目。批量数据以数组形式传递:
```json
[
{ "json": { ... } },
{ "json": { ... } },
... // 一批最多包含指定数量的条目
]
```
### 三、JSON数据的访问与操作
1. **表达式引擎**
通过`{{ }}`语法动态访问或操作JSON数据:
- 访问当前条目字段:`{{ $json.field_name }}`
例如:`{{ $json.email }}`获取邮箱
- 访问嵌套字段:`{{ $json.user.address.city }}`
- 访问数组元素:`{{ $json.items[0].price }}`
2. **函数节点(Function Node)**
使用JavaScript代码灵活处理JSON数据:
```javascript
// 示例:将姓和名拼接为全名
for (const item of items) {
item.json.fullName = `${item.json.firstName} ${item.json.lastName}`;
}
return items;
```
### 四、二进制数据的处理
1. **二进制数据存储结构**
当节点处理文件时,`binary`字段存储文件信息:
```json
{
"json": { ... },
"binary": {
"file1": {
"data": "base64编码的字符串",
"mimeType": "image/png",
"fileSize": 1024
}
}
}
```
2. **二进制数据传递**
后续节点可直接引用二进制数据:
- 表达式访问:`{{ $binary["file1"].data }}`
- 函数节点操作:
```javascript
// 示例:获取Base64数据
const fileData = items[0].binary.file1.data;
```
### 五、特殊数据场景
1. **空数据传递**
起始节点(如定时触发器)可能输出空JSON:
```json
[ { "json": {} } ]
```
2. **多输出分支的数据差异**
当使用`IF`或`Switch`节点时,不同分支可能输出不同结构的JSON:
```mermaid
graph TD
A[HTTP请求] --> B{状态码=200?}
B -- 是 --> C[输出{ data: ... }]
B -- 否 --> D[输出{ error: ... }]
```
### 六、最佳实践[^1]
1. **保持轻量级**
避免在JSON中存储大型二进制数据(超过1MB建议使用云存储链接)
2. **数据类型一致性**
确保相同字段在不同条目中保持相同数据类型(如ID统一为字符串或数字)
3. **错误处理**
使用`Catch`节点捕获异常并添加错误信息到JSON:
```json
{
"success": false,
"error": "Timeout connecting to API"
}
```
> 💡 **调试提示**:在节点间传递时,点击节点间连接线可查看具体JSON数据格式[^1]。
---
§§相关问题§§
1. n8n中如何处理JSON数组的批量操作?
2. 如何通过表达式引擎修改嵌套JSON结构?
3. n8n工作流中二进制数据有哪些使用限制?</think>### n8n 数据流中 JSON 格式传递详解
在 n8n 工作流中,**JSON 是数据传递的核心载体**,所有节点间的信息交换均通过结构化 JSON 对象实现。以下是完整的传递机制解析:
---
#### 一、JSON 数据结构层级
每个节点输出的数据包包含两个核心层级:
```json
{
"json": { // 结构化数据(必选)
"field1": "value",
"nested": { "key": 123 }
},
"binary": { // 二进制数据(可选)
"file1": {
"data": "base64编码数据",
"mimeType": "image/png",
"fileSize": 2048
}
}
}
```
- **json 对象**:承载所有结构化数据,支持无限嵌套
- **binary 对象**:存储文件/二进制数据(如图片、文档)[^1]
---
#### 二、数据传递机制
1. **单条目传递模式**
大多数节点默认逐条处理 JSON 对象:
```mermaid
graph LR
A[节点1] -->|输出单条JSON| B[节点2]
B -->|处理单条数据| C[节点3]
```
- 示例:HTTP 请求节点返回的 API 响应
2. **批量传递模式**
特殊节点(如 SplitInBatches)输出 JSON 数组:
```json
[
{ "json": { "id": 1, ... } },
{ "json": { "id": 2, ... } }
]
```
- 适用场景:数据库查询结果集、CSV 解析数据
---
#### 三、数据访问与操作
通过 **表达式引擎** 动态操作 JSON:
```javascript
// 访问嵌套字段
{{ $json.user.address.city }}
// 操作数组元素
{{ $json.items[0].price * 1.1 }} // 价格增加10%
// 合并对象
{{ { ...$json.user, role: "admin" } }}
```
**特殊访问符**:
| 符号 | 作用 | 示例 |
|------|------|------|
| `$json` | 当前节点输入数据 | `{{ $json.email }}` |
| `$node` | 其他节点输出数据 | `{{ $node["Webhook"].json.id }}` |
| `$item` | 工作流项索引 | `{{ $item.index + 1 }}/{{ $item.total }}` |
---
#### 四、数据类型转换规则
当 JSON 在不同节点间传递时,n8n 自动处理类型转换:
| 原始类型 | 目标节点要求 | 转换行为 |
|----------|--------------|----------|
| 字符串 | 数字字段 | 尝试解析为数字(失败则报错) |
| 日期字符串 | 日期节点 | 自动转为 Date 对象 |
| JSON字符串 | JSON 解析节点 | 自动解析为对象 |
| 数组 | 单条目节点 | 拆分为多条独立数据流 |
---
#### 五、二进制数据传递
处理文件等二进制数据时:
1. 通过 **binary** 字段传递 Base64 编码
2. 专用节点自动解码:
```mermaid
graph LR
A[HTTP请求] -->|含binary的JSON| B[读写文件]
B -->|本地文件路径| C[邮件附件]
```
3. 表达式访问:`{{ $binary["image.png"].data }}`
---
#### 六、最佳实践[^1][^2]
1. **结构一致性**
- 保持字段命名一致性(如统一用 `userId` 而非 `user_id`)
- 嵌套层级不超过 3 层
2. **性能优化**
```javascript
// 避免深层嵌套遍历
{{ $json.items.filter(i => i.price > 100) }} // ✅ 优于 for 循环
// 大文件处理
{{ $binary.file.url }} // 传递云存储URL而非Base64
```
3. **错误处理**
添加错误捕获节点输出结构化错误信息:
```json
{
"success": false,
"error": {
"message": "API timeout",
"node": "Stripe Payment",
"timestamp": "2023-11-20T08:30:00Z"
}
}
```
> 💡 **调试技巧**:点击节点间连接线可查看实时传递的 JSON 数据快照[^1]。
---
阅读全文