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

从Azure存储读取JSON文件反序列化遇解析错误(JsonLint验证有效)

解决JSON反序列化时的"Unexpected character encountered"错误

你碰到的这个反序列化错误,十有八九是编码问题或者下载的流里混进了非UTF-8的奇怪字符导致的,我给你梳理几个排查和解决的方向:

可能的原因及解决办法

1. 检查UTF-8 BOM(字节顺序标记)的干扰

有些UTF-8格式的JSON文件开头会带BOM(对应字节EF BB BF),当你直接用Encoding.UTF8.GetString转字符串时,这个BOM会被当成无效字符,就会出现你看到的那个?错误。

解决方式很简单,用UTF8Encoding的重载明确忽略BOM:

var utf8WithoutBom = new UTF8Encoding(false);
string content = utf8WithoutBom.GetString(memoryStream.ToArray());

2. 先确认下载的内容到底是什么

有时候从Azure存储下载的流可能有损坏,或者不是你预期的纯JSON内容。你可以先把转换后的content输出一小段看看,比如打印前50个字符:

Console.WriteLine("内容开头预览:" + content.Substring(0, Math.Min(content.Length, 50)));

如果发现开头有?或者其他非JSON的字符,那得去检查Azure存储里的原始文件是不是有问题,或者下载过程中有没有额外的字节被加进来。

3. 确保实体类和JSON结构完全匹配

虽然你说JSON是合法的,但也得确认MyParamObject的属性和JSON里的字段对应上(默认Json.NET是区分大小写的哦)。比如如果JSON里是小写的param1,而你的类属性是Param1,没加特性的话也可能出问题——不过你的错误是开头字符的问题,这个可以作为次要排查项:

public class MyParamObject
{
    [JsonProperty("param1")] // 如果JSON字段是小写,加上这个特性匹配
    public string Param1 { get; set; }
    
    [JsonProperty("param2")]
    public string Param2 { get; set; }
}

4. 直接从流反序列化,跳过字符串转换

有时候手动把流转成字符串的过程容易引入编码问题,不如让Json.NET直接从流里读取解析,这样更稳妥:

memoryStream.Position = 0; // 记得把流的位置重置到开头
List<MyParamObject> deserialized = JsonConvert.DeserializeObject<List<MyParamObject>>(new StreamReader(memoryStream, Encoding.UTF8));

总结

优先排查UTF-8 BOM的问题,这是这类开头字符错误最常见的诱因。试试用不带BOM的编码解析,或者直接从流反序列化,应该能解决你的问题。

内容的提问来源于stack exchange,提问作者maracuja-juice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:19:47