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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:25:04