Azure Dataflow中解析字符串为JSON并提取所有值至数组的方案问询
问题背景
从Dataverse读取的表中,某列每行是带特殊键(含空格、%)的键值对字符串,直接用Parser活动的常规字段映射会返回空值,需要将所有行的所有值合并为一维数组,供外部ForEach活动遍历。
解决步骤
1. 解析JSON字符串为对象
使用Parser活动,配置如下:
- 选择要解析的目标列(即存储键值对字符串的列)
- 输出列名设为
parsedJson,类型选择Object - 解析模式选择
JSON document(而非字段映射模式)
这样会把每行的字符串完整解析为JSON对象,避开特殊键的识别问题。
2. 提取单行的所有值为数组
添加Derived Column活动,创建新列(比如rowValues),使用表达式:
values(parsedJson)
values()函数会直接提取JSON对象的所有值,返回一个数组,无需关心键的特殊格式,每行输出类似:['093e2b7d-c53a-4387-8b3e-26e4e0386357', '93744353-f1ab-4030-b0e9-d4dce5b169aa', 'd7b04c9b-e2f7-47f9-ae75-b8027627740b']
3. 合并所有行的数组为一维数组
添加Aggregate活动:
- 取消所有分组条件(保持全局聚合)
- 创建新列(比如
allValues),使用表达式:
flatten(collect_list(rowValues))
collect_list()会把所有行的rowValues数组收集为一个二维数组,再通过flatten()将其转为一维数组,最终得到你需要的格式:['093e2b7d-c53a-4387-8b3e-26e4e0386357', '93744353-f1ab-4030-b0e9-d4dce5b169aa', 'd7b04c9b-e2f7-47f9-ae75-b8027627740b','5e6da70c-00e9-482c-8ebf-5a020daedab0', ...]
4. 供外部ForEach活动调用
在Dataflow的输出数据集里,这个一维数组存储在allValues列中。在ForEach活动的Items属性中,引用该数组:
@activity('你的Dataflow活动名称').output.first().allValues
即可遍历每个UUID值。
为什么之前的Parser表达式无效
因为键包含空格、%等特殊字符,Dataflow的字段引用语法{键名}无法识别这类特殊格式的键,通过先解析为完整JSON对象,再用values()提取值的方式,就能绕过键名的格式限制。
内容的提问来源于stack exchange,提问作者York

