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

从存储过程生成JSON文件时阻止ADF转义字符的方法

问题

使用Azure Data Factory(ADF)复制数据活动执行存储过程,该过程通过FOR JSON PATH将查询结果输出为JSON。复制活动将数据写入指定文件夹的.json文件,但文件中双引号被\转义,导致JSON无效。

示例存储过程:

CREATE PROCEDURE #testJson
AS
    SELECT 'Michael' AS Forename, 'Smith' AS Surname 
    FOR JSON PATH

EXEC #testJson

SQL Server中存储过程的输出为:

[ { "Forename": "Michael", "Surname": "Smith" } ]

但ADF输出的内容为:

[{\"Forename\":\"Michael\",\"Surname\":\"Smith\"}]

复制活动的JSON配置如下:

{
    "name": "Copy stored proc to JSON",
    "type": "Copy",
    "dependsOn": [],
    "policy": {
        "timeout": "0.12:00:00",
        "retry": 0,
        "retryIntervalInSeconds": 30,
        "secureOutput": false,
        "secureInput": false
    },
    "userProperties": [],
    "typeProperties": {
        "source": {
            "type": "AzureSqlSource",
            "sqlReaderStoredProcedureName": "#testJson",   
            "queryTimeout": "02:00:00",
            "partitionOption": "None"
        }, 
        "sink": {
            "type": "JsonSink",
            "storeSettings": {
                "type": "AzureBlobStorageWriteSettings"
            },
            "formatSettings": {
                "type": "JsonWriteSettings"
            }
        },
        "enableStaging": false
    },
    "inputs": [
        {
            "referenceName": "DestinationTables",
            "type": "DatasetReference",
            "parameters": {
                "TableSchema": "",
                "TableName": ""
            }
        }  
    ],
    "outputs": [  
        {
            "referenceName": "testJsonOutput",
            "type": "DatasetReference"
        }
    ]
}
解决方法

核心原因是ADF的JsonSink会将存储过程返回的JSON字符串视为普通文本字段,自动对双引号进行转义处理。以下是两种可行的解决方式:

方案1:改用BlobSink直接写入原始文本

将复制活动的接收器从JsonSink改为BlobSink,让ADF直接写入存储过程返回的原始JSON内容,不进行额外转义。

修改后的接收器配置示例:

"sink": {
    "type": "BlobSink",
    "storeSettings": {
        "type": "AzureBlobStorageWriteSettings"
    }
}

同时调整输出数据集的格式为纯文本,指定文件名后缀为.json:

{
    "name": "testJsonOutput",
    "type": "AzureBlobStorage",
    "typeProperties": {
        "fileName": "output.json",
        "folderPath": "your-target-folder",
        "format": {
            "type": "TextFormat",
            "encoding": "UTF-8",
            "columnDelimiter": "",
            "rowDelimiter": ""
        }
    }
}

方案2:修改存储过程输出逻辑(可选)

如果必须使用JsonSink,可以修改存储过程,让其返回表结构数据而非预生成的JSON字符串,由ADF自行转换为JSON格式。

修改后的存储过程示例:

CREATE PROCEDURE #testJson
AS
    SELECT 'Michael' AS Forename, 'Smith' AS Surname 

此时JsonSink会将查询结果直接转换为正确的JSON格式,不会出现转义问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:08:26