You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Data Factory表达式构建器如何动态修改JSON节点名?

问题描述

调用第三方REST API,传入设备序列号后返回JSON数据,其中存在以序列号命名的动态节点。目前通过固定表达式activity('Web1').output.root.SERIALXXXXX.values.variousArrays获取值,但需要动态修改节点名。想知道Azure Data Factory(ADF)表达式构建器中是否有类似evaluate的函数支持动态构建节点名;如果没有的话,是否必须开发Azure Function封装API来重构数据结构(希望避免重复工作)。

API返回的JSON结构如下:

{
    "historicData": {
        "success": true,
        "params": {
            "value": [
                {
                    "SERIAL123": {
                        "Array1": [
                            0.0,
                           ...
                            0.0
                        ],
                        "Array2": [
                            0,
                           ...
                            0
                        ],
                        "timestamp": [
                            "2023-07-18T00:03:02Z",
                            ...
                            "2023-07-18T02:21:42Z"
                        ]
                    }
                },
                {
                    "SERIAL456": {
                        "Array1": [
                            0.0,
                           ...
                            0.0
                        ],
                        "Array2": [
                            0,
                            ...
                            0
                        ],
                        "timestamp": [
                            "2023-07-18T00:03:02Z",
                            ...
                            "2023-07-18T02:21:42Z"
                        ]
                    }
                }
            ]
        }
    }
}
解决方案

1. 动态访问节点的核心方法

ADF表达式语言无需类似evaluate的函数,通过方括号语法即可实现动态节点名访问,分两种场景处理:

场景1:已知目标序列号(存储在变量/参数中)

假设序列号存在参数deviceSerial或变量deviceSerial中,直接用方括号传入动态值即可:

activity('Web1').output.historicData.params.value[0][variables('deviceSerial')].Array1
  • 说明:方括号[]支持传入任意字符串类型的动态值(变量、参数、表达式生成的字符串),直接定位到目标节点。

场景2:遍历所有序列号节点(无需提前知道序列号)

如果需要批量处理所有设备数据,结合ForEach活动与values()函数:

  1. 将ForEach的迭代器设为@activity('Web1').output.historicData.params.value
  2. 在活动内部,用@values(item())[0]提取每个对象中的序列号节点内容,示例表达式:
@values(item())[0].timestamp
  • 说明:values()函数会提取对象的所有属性值,由于每个数组元素仅包含一个序列号节点,取索引[0]即可拿到对应的数据结构。

2. 无需开发Azure Function的重构方案

如果动态访问仍无法满足后续流程需求,可通过ADF数据流重构数据结构:

  • 使用Flatten转换,将动态序列号节点展开为固定字段(比如重命名为deviceData);
  • 或用Derived Column转换,通过values(item())[0]提取数据后生成固定结构的列。

3. 关于evaluate类函数的说明

ADF表达式语言中没有直接的evaluate函数,但通过方括号动态访问、values()、keys()等组合,完全可以覆盖动态节点名的处理需求,无需额外开发Azure Function。

内容的提问来源于stack exchange,提问作者Michele Baronchelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:43:11