C#中Json.NET解析JSON遇[字符报错,寻求原因及解决办法
这种情况我之前也碰到过好几次——明明JSON在其他平台能用、在线校验也合法,偏偏在C#里用Json.NET就报错。核心原因基本都是解析逻辑和JSON的实际结构不匹配,或者字符串本身有隐藏问题,给你几个具体的排查和解决方向:
最常见:把数组当成单个对象解析了
如果你的JSON根节点是数组(开头就是[),但你却用了针对单个对象的反序列化方法,比如:// 错误示例:JSON是数组,但反序列化成单个类 var result = JsonConvert.DeserializeObject<YourSingleModel>(jsonString);Json.NET会期望JSON开头是
{(对象的起始符),结果看到[就直接抛出异常。
解决方法很简单,改成解析数组类型:// 正确:反序列化成集合 var result = JsonConvert.DeserializeObject<List<YourSingleModel>>(jsonString); // 或者先解析成JArray再处理 var jArray = JArray.Parse(jsonString);检查JSON字符串是否有隐藏的特殊字符
有时候从接口、文件或者其他渠道获取的JSON,会带有BOM(字节顺序标记)、零宽空格这类看不见的特殊字符,在线校验工具会自动忽略,但Json.NET对这些字符很敏感。
你可以先清理字符串再尝试解析:jsonString = jsonString.Trim('\uFEFF', '\u200B'); // 去掉BOM和零宽字符 var result = JsonConvert.DeserializeObject(...);确认Json.NET版本是否过时
较老版本的Json.NET可能对某些合法的JSON结构支持不完善,比如复杂嵌套数组的场景,虽然在线校验通过,但旧库处理时会报错。
解决方法:打开NuGet包管理器,搜索Newtonsoft.Json,把版本更新到最新稳定版。排查是否有额外内容混入JSON字符串
有时候你可能在解析前不小心给JSON拼接了其他内容(比如日志前缀、接口响应的状态码文本),导致实际传给Json.NET的字符串开头并不是合法的JSON起始字符。
解决方法:先把要解析的字符串完整打印出来(比如用Console.WriteLine(jsonString)),仔细检查开头和结尾是否有多余的字符。
内容的提问来源于stack exchange,提问作者user3459555

