如何通过Azure Logic Apps将D365 F&O数据事件转为易处理JSON格式
高效实现D365 F&O嵌套JSON的扁平化处理(Azure Logic Apps)
问题分析
你需要将Service Bus推送的D365嵌套JSON转换为扁平化对象,之前用Select操作得到的是字符串数组而非目标对象,且现有方案处理400+数据时耗时超1分钟,核心需求是高效的单步对象转换。
高效解决方案:使用reduce函数构建扁平化对象
Azure Logic Apps的reduce函数可以通过单次遍历数组直接构建目标对象,避免循环操作的性能开销,适合处理大数据量场景。
核心表达式
在Compose操作中使用以下表达式(直接替换为你的实际数据路径即可):
reduce( triggerBody()?['body']?['InputParameters'][0]?['value']?['Attributes'], {}, union( $item, createObject( $current?['key'], if( isObject($current?['value']) and contains($current?['value'], 'Value'), $current?['value']?['Value'], $current?['value'] ) ) ) )
表达式说明
- 数据源路径:
triggerBody()?['body']?['InputParameters'][0]?['value']?['Attributes']指向输入JSON中的Attributes数组 - 初始值:
{}表示从空对象开始构建 - 迭代逻辑:
- 用
createObject将当前数组元素的key和处理后的value转为键值对 - 通过
if判断处理嵌套值:如果value是包含Value属性的对象,则取Value字段,否则直接取原始value - 用
union将当前键值对合并到累积的对象中,逐步构建完整的扁平化对象
- 用
为什么这个方法高效
- 单次遍历数组:
reduce是单步操作,相比For Each循环减少了多次操作调用的开销 - 无额外中间步骤:直接从数组生成目标对象,不需要先生成数组再转换,节省处理时间
- 适配大数据量:处理400+条数据时,性能远优于循环类操作,不会出现超时问题
验证结果
针对你的输入数据,该表达式会输出期望的扁平化对象:
{ "first_name": "john", "last_name": "doe", "age": 25 }
内容的提问来源于stack exchange,提问作者Anders Knudsen
相关产品推荐
相关产品推荐

