使用JsonConvert反序列化DateTime对象遇异常的解决方法
解决Newtonsoft.Json反序列化DateTime字符串抛出JsonReaderException的问题
问题原因分析
你遇到的JsonReaderException(提示Unexpected character encountered while parsing value: 2),最常见的原因是传入反序列化方法的字符串包含了多余的外层双引号,或者字符串前后存在隐藏的不可见字符(比如BOM、零宽空格)。
举个例子:如果你直接把序列化输出的带引号结果"2018-05-25T07:59:27.2175427+02:00"原封不动传入JsonConvert.DeserializeObject<DateTime>(),方法会把外层的双引号当成JSON结构的一部分,而非字符串边界,导致解析失败。
解决方案
下面提供几种可行的解决办法,按优先级排序:
1. 移除字符串外层的双引号
确保传入的是纯日期时间字符串(不带外层引号):
// 正确的输入:不带外层双引号的日期字符串 string validDateStr = "2018-05-25T07:59:27.2175427+02:00"; DateTime parsedDate = JsonConvert.DeserializeObject<DateTime>(validDateStr);
如果你的原始字符串是带引号的(比如直接复制了序列化输出),可以手动去除引号:
string quotedDateStr = "\"2018-05-25T07:59:27.2175427+02:00\""; string cleanDateStr = quotedDateStr.Trim('"'); DateTime parsedDate = JsonConvert.DeserializeObject<DateTime>(cleanDateStr);
2. 先反序列化为string再转换
如果必须处理带引号的JSON字符串,也可以先把它反序列化为string类型,再转成DateTime:
string quotedDateStr = "\"2018-05-25T07:59:27.2175427+02:00\""; string dateStr = JsonConvert.DeserializeObject<string>(quotedDateStr); DateTime parsedDate = DateTime.Parse(dateStr);
3. 显式指定日期格式
如果是格式兼容性问题,可以通过JsonSerializerSettings明确指定日期格式,确保解析规则匹配:
var settings = new JsonSerializerSettings { DateFormatString = "yyyy-MM-dd'T'HH:mm:ss.fffffffzzz" }; string dateStr = "2018-05-25T07:59:27.2175427+02:00"; DateTime parsedDate = JsonConvert.DeserializeObject<DateTime>(dateStr, settings);
4. 检查并移除隐藏字符
如果字符串存在隐藏的不可见字符(比如UTF-8 BOM),可以先清理再解析:
// 示例:带BOM的日期字符串 string dateStrWithBom = "\uFEFF2018-05-25T07:59:27.2175427+02:00"; // 移除BOM和零宽空格等隐藏字符 string cleanDateStr = dateStrWithBom.Trim(new char[] { '\uFEFF', '\u200B' }); DateTime parsedDate = JsonConvert.DeserializeObject<DateTime>(cleanDateStr);
验证方法
你可以先打印字符串的长度和每个字符的编码,确认是否有多余字符:
string dateStr = "你的日期字符串"; Console.WriteLine($"字符串长度:{dateStr.Length}"); foreach (char c in dateStr) { Console.WriteLine($"字符:{c},编码:{(int)c}"); }
如果长度比预期长,或者开头/结尾有非可见字符,就需要先清理。
内容的提问来源于stack exchange,提问作者g.pickardou
相关产品推荐
相关产品推荐

