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

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结构的解析。
修复方法
  1. 删除多余的二次序列化代码,直接使用Blob解码得到的原始JSON字符串做反序列化
  2. 读取内容时跳过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:09:26