Azure Data Factory Lookup读取JSON时键不区分大小写问题咨询
问题原因
ADF Lookup活动默认采用不区分大小写的JSON键解析逻辑,这是因为其底层依赖的.NET相关JSON解析组件默认使用不区分大小写的字典存储键值对,导致G_key1和g_key1被识别为同一键,后出现的键值会覆盖前者。尽管JSON规范明确键区分大小写,但ADF Lookup的默认配置并未遵循这一严格规则。
解决建议与方案
方案1:改用Copy活动+JSON数据集大小写保留配置
这是最直接的解决方式,无需额外代码开发:
- 创建或编辑JSON数据集,进入格式设置面板,勾选
Preserve case选项,确保读取JSON时保留键的大小写。 - 使用Copy活动将Blob中的JSON数据直接加载到目标数据库表,或先复制到ADLS Gen2等中间存储,再通过Lookup活动读取处理后的文件。
方案2:通过Azure Function自定义解析JSON
如果必须使用Lookup活动,可借助Azure Function实现严格区分大小写的JSON解析:
- 编写Azure Function,使用区分大小写的JSON解析库(如Newtonsoft.Json默认支持,或
System.Text.Json设置JsonSerializerOptions.PropertyNameCaseInsensitive = false)读取Blob中的JSON文件,保留所有大小写不同的键。 - 示例C#代码片段:
using System.IO; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using Azure.Storage.Blobs; public static class CaseSensitiveJsonParser { [FunctionName("CaseSensitiveJsonParser")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { var requestBody = await new StreamReader(req.Body).ReadToEndAsync(); var blobUri = requestBody; // 传入Blob文件的URI var blobClient = new BlobClient(new Uri(blobUri)); var jsonContent = await blobClient.DownloadContentAsync(); // 使用Newtonsoft.Json默认区分大小写的解析 var parsedJson = JsonConvert.DeserializeObject<dynamic>(jsonContent.Value.Content.ToString()); return new OkObjectResult(parsedJson); } } - 在ADF中添加Web活动调用该Azure Function,获取保留大小写的JSON结果后,再通过后续活动处理或加载到数据库。
方案3:使用Data Flow活动处理
Data Flow支持严格保留JSON键的大小写,适合复杂数据转换场景:
- 创建Data Flow,源选择Blob存储的JSON数据集,在源的Options面板中勾选
Preserve case。 - 添加必要的转换操作后,通过Sink组件将数据直接写入目标数据库表,或输出为保留大小写的JSON文件供Lookup活动使用。
内容的提问来源于stack exchange,提问作者Vrishab Sharma
相关产品推荐
相关产品推荐

