如何在Azure Data Factory的复制操作中解析指定JSON内容
嘿,我来帮你搞定Azure Data Factory里解析这段特殊格式JSON的问题!先瞅一眼你给的这段内容,它确实有点“不按常理出牌”——不仅有转义错误,还嵌套了非标准的类JSON结构,咱们一步步拆解处理。
第一步:先理清源JSON的问题
你提供的这段内容本身不是标准JSON,有几个明显的语法bug:
Properties字段用了::\"而非标准的:"- 内部的
"receivedPushNotificationMessage""Received是双引号错误,应该是"receivedPushNotificationMessage":"Received - 嵌套的
aps = { alert = "Network programmer push"; };是类JSON结构,但用了等号、分号,不是标准的键值对格式
所以咱们得先把这些格式问题修复,才能在ADF里正常解析。
第二步:ADF复制操作中的解析方案
这里给你两个实用方案,根据你的数据量和复杂度选就行:
方案一:用数据流+派生列表达式(适合批量数据)
ADF的数据流自带强大的字符串和JSON处理函数,咱们可以逐步清洗:
修复外层JSON语法
先用replace函数修正错误的符号:replace(replace(yourSourceColumn, '::\"', ':"'), '""', '":"')这个操作会把
Properties::\"改成Properties:",把"receivedPushNotificationMessage""Received改成"receivedPushNotificationMessage":"Received,先让外层变成标准JSON结构。提取Properties字段的嵌套字符串
把修正后的外层JSON转成对象,提取Properties的值:json(replace(replace(yourSourceColumn, '::\"', ':"'), '""', '":"')).Properties这时候你得到的是
Properties里那个带aps = { ... }的非标准字符串。把非标准结构转成标准JSON
这里用regexReplace正则替换来处理等号和分号:regexReplace(regexReplace(yourExtractedPropertiesString, '([a-zA-Z0-9_]+)\\s*=\\s*"([^"]+)"', '"$1":"$2"'), ';', ',')解释下:
- 第一个正则把
alert = "Network programmer push"这种格式替换成"alert":"Network programmer push" - 第二个替换把分号改成逗号,适配JSON语法
- 第一个正则把
解析成JSON对象并提取字段
最后把处理后的字符串转成JSON对象,就能提取aps.alert、channelToken等字段了,比如提取推送内容:json(regexReplace(regexReplace(json(replace(replace(yourSourceColumn, '::\"', ':"'), '""', '":"')).Properties, '([a-zA-Z0-9_]+)\\s*=\\s*"([^"]+)"', '"$1":"$2"'), ';', ',')).aps.alert
方案二:用自定义活动(Python脚本,适合复杂场景)
如果你的JSON格式特别混乱,表达式搞不定,就用自定义活动写Python脚本处理:
- 在ADF里创建自定义活动,选择Python运行环境,把脚本上传到ADLS/Blob存储
- 示例Python脚本:
import json import re def fix_special_json(raw_str): # 修复外层的转义和双引号错误 fixed_raw = raw_str.replace('::\\"', ':"').replace('""', '":"') # 解析外层JSON outer_json = json.loads(fixed_raw) # 提取Properties里的字符串 prop_str = outer_json['Properties'] # 替换类JSON结构为标准JSON # 处理key = "value"格式 prop_str_fixed = re.sub(r'([a-zA-Z0-9_]+)\s*=\s*"([^"]+)"', r'"\1":"\2"', prop_str) # 处理key = { 格式 prop_str_fixed = re.sub(r'([a-zA-Z0-9_]+)\s*=\s*{', r'"\1":{', prop_str_fixed) # 把分号换成逗号 prop_str_fixed = prop_str_fixed.replace(';', ',') # 解析Properties的JSON prop_json = json.loads(prop_str_fixed) # 整合所有需要的字段 result = { 'time': outer_json.get('time'), 'AppBuild': outer_json.get('AppBuild'), 'push_alert': prop_json['aps']['alert'], 'channel_token': prop_json['channelToken'] } return result # 读取ADF输入并处理 input_data = json.loads(open('input.json').read()) output_data = fix_special_json(input_data['raw_json']) # 写入输出文件供后续使用 with open('output.json', 'w') as f: json.dump(output_data, f) - 配置自定义活动的输入输出路径,运行后就能得到结构化的解析结果。
小提示
- 数据流适合处理批量数据,效率更高;自定义活动适合格式特别复杂的场景
- 测试的时候可以用ADF数据流的调试模式,逐步验证每一步的表达式结果,避免踩坑
内容的提问来源于stack exchange,提问作者Gagan Madaan
相关产品推荐
相关产品推荐

