从存储过程生成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
相关产品推荐
相关产品推荐

