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

如何在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处理函数,咱们可以逐步清洗:

  1. 修复外层JSON语法
    先用replace函数修正错误的符号:

    replace(replace(yourSourceColumn, '::\"', ':"'), '""', '":"')
    

    这个操作会把Properties::\"改成Properties:",把"receivedPushNotificationMessage""Received改成"receivedPushNotificationMessage":"Received,先让外层变成标准JSON结构。

  2. 提取Properties字段的嵌套字符串
    把修正后的外层JSON转成对象,提取Properties的值:

    json(replace(replace(yourSourceColumn, '::\"', ':"'), '""', '":"')).Properties
    

    这时候你得到的是Properties里那个带aps = { ... }的非标准字符串。

  3. 把非标准结构转成标准JSON
    这里用regexReplace正则替换来处理等号和分号:

    regexReplace(regexReplace(yourExtractedPropertiesString, '([a-zA-Z0-9_]+)\\s*=\\s*"([^"]+)"', '"$1":"$2"'), ';', ',')
    

    解释下:

    • 第一个正则把alert = "Network programmer push"这种格式替换成"alert":"Network programmer push"
    • 第二个替换把分号改成逗号,适配JSON语法
  4. 解析成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脚本处理:

  1. 在ADF里创建自定义活动,选择Python运行环境,把脚本上传到ADLS/Blob存储
  2. 示例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)
    
  3. 配置自定义活动的输入输出路径,运行后就能得到结构化的解析结果。
小提示
  • 数据流适合处理批量数据,效率更高;自定义活动适合格式特别复杂的场景
  • 测试的时候可以用ADF数据流的调试模式,逐步验证每一步的表达式结果,避免踩坑

内容的提问来源于stack exchange,提问作者Gagan Madaan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:10:58