如何在Azure Logic Apps中拆分JSON数组为30MB以内的块分批发送?
刚好之前处理过类似的Logic Apps大payload拆分场景,给你几个实用的解决方案,既能满足30MB的限制,又不会过度拆分拖慢运行时长:
解决方案:拆分JSON数组适配30MB POST限制
方案1:用Logic Apps内置动作实现无代码拆分
这个方案完全依赖Logic Apps原生组件,不用额外写代码,适合快速落地:
先估算单条JSON对象的字节大小
- 从转换后的JSON数组里取一条对象,用
string()函数转成字符串,再用base64Length(string(jsonObject))函数获取近似字节数(比length()更准确,因为它会考虑UTF-8编码的字节占用) - 计算30MB(31457280字节)能容纳的条目数,比如单条平均1KB的话,30MB大概能放30720条,一定要留10%-20%的余量(比如按27000条/块算),因为数组的括号、逗号也会占用字节,避免刚好卡到阈值导致失败
- 从转换后的JSON数组里取一条对象,用
添加Split array动作拆分数组
- 在步骤3(拼接JSON字符串)之后,添加「Split array」动作,选择你的完整JSON数组作为输入,设置「Split into chunks of」为刚才计算的条目数
- 这个动作会自动把大数组拆分成多个子数组,每个子数组的大小控制在30MB以内
循环发送每个子数组
- 添加「For each」循环,遍历Split array输出的子数组列表
- 在循环内部调用Send Data连接器,把当前子数组作为请求体发送
- 可以在循环里加个1秒的延迟动作,避免触发目标API的速率限制
方案2:用Azure Function实现精准字节拆分
如果内置动作的条目数估算不够精准(比如JSON对象大小差异很大),可以用Azure Function做自定义拆分,按实际字节数控制每块大小:
创建C# Azure Function
写一个HTTP触发的函数,接收完整JSON数组和最大允许字节数(3010241024),然后逐个累加对象,直到接近阈值就拆分:[FunctionName("SplitJsonArrayByByteSize")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { var requestBody = await new StreamReader(req.Body).ReadToEndAsync(); var input = JsonConvert.DeserializeObject<SplitRequest>(requestBody); var jsonArray = JArray.Parse(input.JsonArray); var maxBytes = input.MaxBytes; var chunks = new List<JArray>(); var currentChunk = new JArray(); int currentByteSize = 0; foreach (var item in jsonArray) { var itemStr = item.ToString(); var itemBytes = Encoding.UTF8.GetByteCount(itemStr); // 加上当前对象后超过阈值,就把当前块存入列表,重新开始新块 if (currentByteSize + itemBytes > maxBytes && currentChunk.Count > 0) { chunks.Add(currentChunk); currentChunk = new JArray(); currentByteSize = 0; } currentChunk.Add(item); currentByteSize += itemBytes; } // 把最后一块加入列表 if (currentChunk.Count > 0) chunks.Add(currentChunk); return new OkObjectResult(chunks); } public class SplitRequest { public string JsonArray { get; set; } public int MaxBytes { get; set; } }在Logic Apps中调用函数
- 在步骤3之后添加HTTP动作,调用这个Azure Function,传入完整JSON数组字符串和30MB对应的字节数
- 接收函数返回的子数组列表,再用「For each」循环逐个调用Send Data连接器发送
方案3:用Batch动作实现自动批量发送(适合非实时场景)
如果你的业务允许延迟发送(比如不需要立刻把所有数据发完),可以用Logic Apps的Batch功能自动分组:
创建Batch配置
- 在Logic Apps中新建一个Batch,设置「Release criteria」:选择「Size in bytes」并填入30MB对应的数值,同时可以设置超时时间(比如10分钟),满足任一条件就发送
- 同样要留10%左右的余量,避免刚好触发阈值
将JSON对象送入Batch
- 把步骤2(Parse JSON)后的单个JSON对象直接发送到Batch,而不是先拼接成大数组
- Batch会自动帮你分组,达到大小或时间条件时,自动调用Send Data连接器发送整批数据
额外优化建议
- 开启重试策略:在Send Data动作里开启重试(比如失败后重试3次,间隔5秒),避免网络波动导致的发送失败
- 避免不必要的字符串拼接:尽量直接传递JSON数组对象,不要手动拼接成字符串,减少内存占用和计算耗时
- 监控拆分效果:运行几次后查看每个子数组的实际大小,调整拆分阈值,找到效率和大小的平衡点
内容的提问来源于stack exchange,提问作者Fazel N
相关产品推荐
相关产品推荐

