使用Newtonsoft解析带毫秒的JSON日期字符串丢失毫秒问题
问题原因与解决方案
原因
Newtonsoft.Json 默认会自动识别 JSON 中的日期格式字符串(比如2024-12-28T00:01:04.09424Z),将其解析为DateTime类型存储在JObject中,而非保留原始字符串。当你调用ToObject<MyDocument>()时,这个DateTime对象会被转换为默认格式的字符串(yyyy-MM-ddTHH:mm:ss),导致毫秒和时区标识Z丢失。非日期类字符串不会触发这个自动识别逻辑,所以能完整保留。
解决方法
方法一:全局禁用日期自动识别
解析时通过JsonSerializerSettings关闭日期自动识别,直接反序列化为模型:
string data = File.ReadAllText(filePath); var settings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.None }; MyDocument mydoc = JsonConvert.DeserializeObject<MyDocument>(data, settings); string dateGenerated = mydoc.Version.Elements.Find(x => x.Key == "DateGenerated").Value; Console.WriteLine(dateGenerated);
方法二:从JObject直接提取原始字符串
如果必须使用JObject解析,直接通过JToken.Value<string>()获取原始文本,避免自动类型转换:
string data = File.ReadAllText(filePath); JObject jsonObject = JObject.Parse(data); // 遍历elements找到目标项 var targetElement = jsonObject["version"]["elements"] .FirstOrDefault(j => j["key"].Value<string>() == "DateGenerated"); string dateGenerated = targetElement["value"].Value<string>(); Console.WriteLine(dateGenerated);
方法三:给模型属性添加强制字符串转换特性
在VersionElement的Value属性上添加特性,强制Json.NET按字符串解析该字段:
public partial class VersionElement { [JsonProperty("key")] public string Key { get; set; } [JsonProperty("value")] [JsonConverter(typeof(StringConverter))] public string Value { get; set; } }
之后正常使用原有解析代码即可,无需额外设置。
内容的提问来源于stack exchange,提问作者user2148983
相关产品推荐
相关产品推荐

