C#解析Azure Blob内容为Dictionary<string,dynamic>报错如何解决
问题根因
抛出反序列化异常是两个代码问题共同导致的:
- 多余的二次序列化逻辑:从Blob下载解码得到的
blobContents本身已经是标准JSON字符串,你额外调用System.Text.Json.JsonSerializer.Serialize对这个字符串再做序列化,会把整个JSON内容转义为双引号包裹的普通字符串值。Newtonsoft.Json拿到的输入不是JSON对象结构,自然无法转换为Dictionary<string, dynamic>类型。 - UTF-8 BOM字符干扰:异常信息里值开头的
是UTF-8 BOM(字节顺序标记),默认Encoding.UTF8.GetString读取带BOM的内容时,会把这个不可见字符保留在字符串开头,直接破坏JSON结构的解析。
修复方法
- 删除多余的二次序列化代码,直接使用Blob解码得到的原始JSON字符串做反序列化
- 读取内容时跳过BOM头,或者反序列化前清除字符串开头的BOM字符
修复后可运行代码
static async Task Main() { BlobServiceClient blobServiceClient = new BlobServiceClient("#"); BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("#"); var blobClient = containerClient.GetBlobClient("#"); // 适配async Main语法,使用异步下载方法避免阻塞 var response = await blobClient.DownloadContentAsync(); var data = response.Value.Content; // 使用无BOM的UTF8编码读取,自动跳过文件头的BOM标记 var blobContents = new UTF8Encoding(false).GetString(data); // 双重保险清除开头可能残留的BOM字符,直接反序列化原始JSON Dictionary<string, dynamic>? values = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(blobContents.TrimStart('\uFEFF')); }
可选优化
如果没有强依赖Newtonsoft.Json,可以全程使用内置的System.Text.Json完成解析,减少第三方依赖,注意用JsonElement替代dynamic获得更好的兼容性:
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; Dictionary<string, JsonElement>? values = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(blobContents.TrimStart('\uFEFF'), options);
内容的提问来源于stack exchange,提问作者superDu
相关产品推荐
相关产品推荐

