在ADF复制活动中展平嵌套数组JSON的问题咨询
在Azure Data Factory中展平含内部数组的嵌套JSON到CSV
针对你提供的嵌套JSON结构(外层results数组、内层stages数组+metadata嵌套对象),以下是两种可靠的解决方案,同时解决你遇到的动态映射双引号问题:
方法一:复制活动分层映射(推荐,无复杂动态逻辑)
无需手动写动态映射,利用ADF原生的分层映射能力快速展平:
- 配置源JSON数据集
- 选择JSON格式,在
JSON settings中设置Array of objects路径为$['results'],让ADF将外层results数组作为数据源的行。
- 选择JSON格式,在
- 配置复制活动映射
- 进入
映射页签,点击导入架构,ADF会自动识别嵌套结构。 - 找到
stages字段,点击右侧的展开图标(⊞),选择「展开到新行」,此时每个stages元素会生成独立一行,同时保留外层results的所有字段(如label、disOrd、id)。 - 对
stages下的metadata嵌套对象,同样点击展开图标,选择「展开为列」,将isClosed、probability拆分为单独列。 - 按需调整列名和数据类型,匹配CSV目标需求。
- 进入
- 配置目标CSV数据集
- 选择CSV格式,设置输出路径,配置分隔符、编码等参数,确保展平后的列能正确写入。
方法二:数据流转换(适合复杂嵌套场景)
如果复制活动的映射不够灵活,用数据流的展平转换更可控:
- 创建数据流并添加源转换
- 选择JSON数据源,在
选项中设置JSON path为$['results'],读取外层数组。
- 选择JSON数据源,在
- 添加展平转换
- 将展平的
源列设为stages,选择「展平为新行」,让每个stages元素与外层行关联生成新行。
- 将展平的
- 添加派生列转换
- 派生新列提取嵌套字段:比如
isClosed设为stages.metadata.isClosed,probability设为stages.metadata.probability,将嵌套结构转为扁平列。
- 派生新列提取嵌套字段:比如
- 添加选择转换
- 筛选保留需要的列,移除原嵌套的
stages字段。
- 筛选保留需要的列,移除原嵌套的
- 添加接收器转换
- 选择CSV作为目标数据集,配置输出路径完成写入。
解决动态映射的双引号问题
如果你仍需要使用动态映射实现,注意ADF表达式的字符串转义规则:
- 拼接JSON格式的映射时,双引号需用反斜杠转义,同时内层的单引号用于包裹JSON路径的键名:
'{"source": {"path": "$[\'stages\'][' + string(variables('index')) + '][\'metadata\'][\'isClosed\']"}, "sink": {"name": "isClosed"}}' - 建议用
json()函数将拼接后的字符串转为JSON对象,避免格式错误:json(concat('{"source": {"path": "$[\'stages\'][' , string(variables('index')) , '][\'metadata\'][\'isClosed\']"}, "sink": {"name": "isClosed"}}'))
内容的提问来源于stack exchange,提问作者Mehrsa
相关产品推荐
相关产品推荐

