n8n webhook 节点接收 JSON 数据后,如何正确解析与提取字段?

2026-02-04 17 0

Webhook 接收数据容易,但“读懂”才是自动化的核心

笔者在 N8N大学 社区里,看到太多同学卡在第一步:Webhook 节点明明接收到了数据,却不知道怎么把里面的值拿出来用。这种感觉就像收到了一个层层包裹的快递,看着挺大,却不知道怎么拆。

其实,n8n 的 Webhook 节点设计得非常聪明,它把外部传进来的 JSON 数据自动转换成了 n8n 的标准数据格式(Item)。今天这篇硬核教程,笔者就带你拆解开这个“快递”,教你如何精准提取每一个字段。

第一步:理解 Webhook 的“数据映射”机制

很多新手的第一反应是:我传了一个 JSON,为什么在 n8n 里看不到树状结构?

n8n 的 Webhook 节点有一个核心机制,它会把接收到的 JSON 数据自动映射到 body 对象中。这意味着,无论你传的是简单的键值对,还是复杂的嵌套 JSON,它们都躺在 body 这个大盒子里。

所以,提取字段的第一步,就是学会在表达式里引用 body

第二步:使用“表达式”提取单层字段

假设你的 Webhook 接收到了如下最简单的 JSON 数据:

{
  "name": "N8N大学",
  "status": "active"
}

在 n8n 中,如果你想提取 "name" 这个字段,你需要使用 表达式 (Expression)

  1. 在后续节点(如 HTTP Request 或 Set 节点)的输入框中,点击输入框旁的 fx 按钮。
  2. 输入:{{ $json.body.name }}

解析: 这里的 $json 代表当前数据项,body 是 Webhook 自动映射的根路径,name 则是你具体的字段名。

第三步:提取嵌套 JSON 对象(深度解析)

实战中,我们面对的往往是复杂的嵌套结构。例如,一个支付回调可能长这样:

{
  "event": "payment.success",
  "data": {
    "order_id": 12345,
    "user": {
      "id": 67890,
      "email": "student@n8ndx.com"
    }
  }
}

这时候,提取深层字段的语法就是“层层剥洋葱”:

  • 提取订单 ID:{{ $json.body.data.order_id }}
  • 提取用户邮箱:{{ $json.body.data.user.email }}

笔者经验: 如果你不确定路径是否正确,可以在 Webhook 节点后连接一个 Set 节点,或者直接使用 Debug 节点,查看数据结构的可视化展示,确认路径后再写表达式。

第四步:处理数组(List)数据

如果 Webhook 传来的 JSON 是一个数组,比如商品列表,n8n 会自动将其拆分为多个 Item 进行处理。

数据结构如下:

[
  { "product": "鼠标", "price": 50 },
  { "product": "键盘", "price": 100 }
]

当你在后续节点使用 {{ $json.body.product }} 时,n8n 会自动遍历:

  1. 第一个 Item 处理 "鼠标"。
  2. 第二个 Item 处理 "键盘"。

你不需要写循环代码,n8n 的核心逻辑就是基于 Item 的流式处理。

第五步:避坑指南——Header 与 Query 参数的提取

除了 JSON Body,Webhook 还经常带有 Header(如 API Token)或 Query Params(如 ?source=web)。

在 n8n 的 Webhook 节点配置中,你需要开启对应的设置:

  • Header 参数: 在 Webhook 节点的设置里,将 "Response" 栏下的 "Options" 展开,确保 "Raw Body" 没有勾选(除非你必须处理原始流),然后在表达式中使用 {{ $headers.header_name }}
  • Query 参数: 同样在 Webhook 配置中,开启 "Query Parameters",在表达式中使用 {{ $query.parameter_name }}

硬核提示: 如果你在 Webhook 节点的输出里看不到 headers 或 query,记得去 Webhook 节点的 "Parameters" -> "Options" 里,把 "Include Headers" 或 "Include Query" 勾选上,否则 n8n 默认可能不暴露这些数据。

FAQ:Webhook 数据提取常见问题

1. 为什么我使用了表达式,却提示 "undefined"?
通常是因为路径写错了。请仔细检查 JSON 结构层级,确保大小写一致。最简单的排查方法是:在 Webhook 后加一个 Set 节点,用 {{ JSON.stringify($json.body, null, 2) }} 输出整个结构,对照着写。

2. Webhook 接收的数据是 XML 格式怎么办?
n8n 的 Webhook 节点原生接收的是字符串。如果对方发来的是 XML,你不能直接用 $json.body.field。你需要先连接一个 Code 节点(使用 Node.js)或 XML 节点将 XML 转换为 JSON,然后再进行提取。

3. 我想修改 Webhook 返回给调用方的数据,怎么操作?
在 Webhook 节点下方连接一个 Respond 节点。在 Respond 节点中,你可以设置 HTTP 状态码(如 200),并在 "Body" 里填入你想返回的 JSON 数据,例如 { "msg": "接收成功", "id": {{ $json.body.id }} }

总结与资源

在 n8n 中,Webhook 是连接外部世界的桥梁,而表达式则是开启这座桥梁的钥匙。掌握 $json.body$headers$query 这三个核心变量,你就能处理 90% 的数据接收场景。

如果你在配置过程中遇到报错,或者有更刁钻的数据结构需要处理,欢迎在 N8N大学 (n8ndx.com) 留言,笔者会持续更新实战案例。记住,自动化不仅是技术,更是解决问题的艺术。

相关文章

n8n Error Handling 节点报错太心烦?试试这些更灵活的替代方案
n8n 节点报错了?用 Error Handling 让它自动重试并通知你
n8n Wait节点在数据同步中的延迟控制实战
n8n Wait节点免费版:我能用它实现定时任务吗?
n8n Error Handling节点:当自动化流程“翻车”时,如何让它自动“扶起来”?
n8n Error Handling节点报错常见问题解决

发布评论