Azure Data Factory中如何将JSON列追加到另一个JSON对象?
解决方案
核心思路
别用@concat()做字符串拼接,改用ADF的union()函数合并对象属性,结合ForEach活动和变量构建合并后的JSON数组,最后保存到存储。
具体步骤
1. 初始化数组变量
在Pipeline里创建一个数组类型的变量,比如命名为mergedResult,用来存合并后的对象数组。
2. 添加ForEach活动遍历Lookup结果
把ForEach活动的Items属性设为Lookup活动的输出数组:
@activity('LookupDataModel').output.value
3. 在ForEach内部处理对象合并
在ForEach里加两个子活动:
- DownloadTextract活动:根据当前迭代项的
ID(@item().ID)执行文本提取,输出要包含Response字段。 - Append to Variable活动:把当前迭代项和DownloadTextract的
Response合并后追加到mergedResult变量,表达式写:@union(item(), activity('DownloadTextract').output.Response)注意:如果
Response和Lookup项有重复字段,union()会用Response里的值覆盖Lookup项的对应值。
4. 保存合并结果到存储
在ForEach之后加Copy Activity:
- 源选Azure Data Factory的变量类型,选中
mergedResult。 - 目标选你的存储服务(比如Blob Storage),设置好文件路径,格式选JSON并设为数组模式。
替代方案(单批小量数据)
如果DownloadTextract输出的是和Lookup数组一一对应的Response数组(比如activity('DownloadTextract').output.ResponseArray),可以直接用表达式构建合并数组,不用ForEach:
@createArray( union(activity('LookupDataModel').output.value[0], activity('DownloadTextract').output.ResponseArray[0]), union(activity('LookupDataModel').output.value[1], activity('DownloadTextract').output.ResponseArray[1]), ... )
这种方式只适合固定长度的小批量数据,大批量数据还是用ForEach更稳妥。
关键注意事项
- 确保DownloadTextract的
Response是JSON对象,不是字符串;如果是字符串,先用@json()转换:@union(item(), json(activity('DownloadTextract').output.Response))。 - ForEach的Sequential属性设为
true会逐个处理项,适合依赖前项结果的场景;设为false并行处理,效率更高。
内容的提问来源于stack exchange,提问作者Anupam
相关产品推荐
相关产品推荐

