AI PLAY玩法更新持续收录
← 回到更新流

2026-10-07 · 原文发布日

用 webhook 合并两份字段不一致的 JSON

调用方 POST datasetA、datasetB 与可选 hints/targetSchema 到 webhook;工作流校验非空后抽取字段类型与样例做 schema profile,HTTP 请求外部 AI mapping API 取得源到目标字段建议,失败时退回字段名启发式。随后生成转换规则,把 A 整形到目标结构并与 B 合并,响应回传合并数据、置信度、低置信映射与审计报告。

原文要点

原模板说明:调用方 POST datasetA、datasetB,可选 hints/targetSchema/requestId 到 webhook;先校验非空,抽取字段类型与样例做 schema profile;把 profile 和样例经 HTTP 发给外部 AI mapping API 请求源到目标字段映射;响应不可用时退回字段名启发式;随后生成转换规则,把 A 整形到目标结构并与 B 合并;响应回传合并数据、映射报告、低置信映射与请求元数据。页面写明当前 API URL 占位为 https://httpbin.org/post,需替换真实 mapping/LLM endpoint,并可调超时与置信阈值。

这次做成什么

做一个可本地练习的“异构 JSON 合并” n8n 服务:Webhook 触发→校验→schema profiling→HTTP 映射→失败启发式→转换合并→响应审计。不编造可导入工作流;外部映射 API 用本站虚构协议示例,真实路径需替换。

准备什么

  • n8n 实例可用 Production Webhook URL,调用方能 POST JSON
  • 一个真实映射/LLM HTTP 端点;练习时可先用回退启发式,不硬依赖外部AI
  • 理解 datasetA/datasetB 为非空数组,元素为扁平 JSON 对象
  • 只用合成数据集测试,不在请求体放密钥或真实个人信息

具体怎么做

  1. 定义入站契约

    Webhook 节点 POST 路径如 /merge-json。Body 校验:datasetA、datasetB 必须是长度>0的数组;可选 hints 为对象,targetSchema 为字段数组,requestId 字符串。缺省返回400与错误JSON。

  2. 生成 schema profile

    Code 节点遍历两数据集,输出 fields:name,type,inferredFrom,example;并取前3行 sample。targetSchema 缺省时用 datasetB 字段并集作为目标,保证A向B靠齐。

  3. 请求映射并兜底

    HTTP Request POST 到真实 mapping endpoint,body 含 profileA/profileB/hints/targetSchema,timeout 如10秒。Error Output 或响应缺 mappings 时进 Code 启发式:按字段名去小写、去下划线后相等或包含匹配,confidence 最高0.65。

  4. 转换、合并、响应

    Set/Code 依据 mappings 生成 rules:source,target,transform,confidence。把 datasetA 重命名/转类型为目标字段,再 concat datasetB;输出 merged、mappingReport(stats,lowConfidence)、audit(requestId,usedFallback,counts)。低置信 threshold 默认0.7可在 Config 改。

可直接复制的材料

Webhook 合成测试请求

合成请求体;字段故意不一致以演示映射,不含真实个人信息。

{"requestId":"req-demo-001","hints":{"cust_no":"customer_id"},"targetSchema":["customer_id","name","email","amount"],"datasetA":[{"cust_no":"A1","full_name":"甲公司","mail":"a1@example.com","total":"120.5"},{"cust_no":"A2","full_name":"乙公司","mail":"a2@example.com","total":"80"}],"datasetB":[{"customer_id":"B1","name":"丙公司","email":"b1@example.com","amount":66}]

外部 mapping API 请求/响应协议示例

本站独立设计协议;原模板未给真实API路径,{real_mapping_url}与字段必须替换。

请求 POST {real_mapping_url} JSON:{"profileA":{"fields":[{"name":"cust_no","type":"string"}],"sample":[{"cust_no":"A1"}]},"profileB":{"fields":[{"name":"customer_id","type":"string"}],"sample":[{"customer_id":"B1"}]},"hints":{"cust_no":"customer_id"},"targetSchema":["customer_id","name","email","amount"]}。期望响应:{"mappings":[{"source":"cust_no","target":"customer_id","confidence":0.98,"transform":"string"},{"source":"full_name","target":"name","confidence":0.9,"transform":"string"},{"source":"mail","target":"email","confidence":0.88,"transform":"string"},{"source":"total","target":"amount","confidence":0.83,"transform":"number"}]}

启发式回退规则伪配置

本站练习用简化逻辑;在 n8n Code 节点需按实际 profileA/targetSchema 变量名接入。

function norm(s){return String(s).toLowerCase().replace(/[_\s-]/g,'');}
const mappings=[];
for(const a of profileA.fields){
  const hit=targetSchema.find(t=>norm(a.name)===norm(t))||targetSchema.find(t=>norm(t).includes(norm(a.name))||norm(a.name).includes(norm(t)));
  if(hit){mappings.push({source:a.name,target:hit,confidence:norm(a.name)===norm(hit)?0.65:0.5,transform:'identity',fallback:true});}
}
return {mappings, usedFallback:true};

输入与输出示例

本站虚构输出;数字与输入对应,未调用真实映射服务。

输入

用上方 webhook 测试请求 POST:datasetA 两条用 cust_no/full_name/mail/total,datasetB 一条用 customer_id/name/email/amount,hints 指定 cust_no→customer_id。

对应输出

成功响应示意关键行:{"merged":[{"customer_id":"A1","name":"甲公司","email":"a1@example.com","amount":120.5},{"customer_id":"A2","name":"乙公司","email":"a2@example.com","amount":80},{"customer_id":"B1","name":"丙公司","email":"b1@example.com","amount":66}],"mappingReport":{"stats":{"mapped":4,"lowConfidence":0},"usedFallback":false},"audit":{"requestId":"req-demo-001","inputRows":3}}

做完检查这些

  • datasetA 或 datasetB 为空数组时返回400且不进入HTTP映射
  • schema profile 对每个字段给出 type/example,sample 不超过前3行
  • 外部API失败或 mappings 缺失时 usedFallback=true,且启发式 confidence 不超过0.65
  • total 字符串 "120.5" 经 number 转换后为120.5,与B的amount数值同列合并
  • 响应含 merged/mappingReport/audit,lowConfidence 列出 confidence<0.7 的映射

容易卡住的地方

  • 当前占位 URL httpbin 只回显请求,不会给真映射;不替换会永远走回退或失败
  • 深层嵌套对象、数组字段和日期时区不能靠字段名启发式稳定处理
  • 把 requestId 当唯一键但不能保证幂等,重复POST可能重复合并,需要调用方去重
  • confidence 阈值过低会把错误映射静默合并,过高会把可用映射全部列入人工复核

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Merge incompatible JSON datasets via webhook with an AI mapping API
原作者
Oneclick AI Squad
原始发布日期
2026-10-06T16:50:10.685Z
来源
https://n8n.io/workflows/20554