C#中MM/dd/yyyy HH:mm:ss格式DateTime的JSON反序列化问题
解决JSON中MM/dd/yyyy HH:mm:ss格式日期反序列化为C# DateTime类型的问题
问题场景
JSON数据中日期字段采用MM/dd/yyyy HH:mm:ss格式,直接反序列化为带DateTime类型字段的C#类时失败,仅当该字段改为string类型时反序列化正常,需保留DateTime类型的解决方案。
解决方案
根据使用的JSON序列化库不同,提供对应配置方式:
1. 使用Newtonsoft.Json(Json.NET)
方式一:全局指定日期格式
反序列化时配置日期格式规则:
var settings = new JsonSerializerSettings { DateFormatString = "MM/dd/yyyy HH:mm:ss", Culture = CultureInfo.InvariantCulture }; var result = JsonConvert.DeserializeObject<List<YourClass>>(jsonString, settings);
方式二:字段级特性标注
直接在date字段上添加特性指定格式:
public class YourClass { public int id { get; set; } public string name { get; set; } [JsonConverter(typeof(IsoDateTimeConverter), "MM/dd/yyyy HH:mm:ss")] public DateTime date { get; set; } }
之后直接执行反序列化:
var result = JsonConvert.DeserializeObject<List<YourClass>>(jsonString);
2. 使用System.Text.Json(.NET Core/.NET 5+默认库)
方式一:全局配置转换器
自定义日期转换器并添加到序列化选项:
// 自定义日期转换器 public class DateTimeConverterUsingDateFormat : JsonConverter<DateTime> { private readonly string _dateFormat; public DateTimeConverterUsingDateFormat(string dateFormat) { _dateFormat = dateFormat; } public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return DateTime.ParseExact(reader.GetString(), _dateFormat, CultureInfo.InvariantCulture); } public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString(_dateFormat, CultureInfo.InvariantCulture)); } } // 反序列化时配置 var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, // 兼容JSON小写字段名 Converters = { new DateTimeConverterUsingDateFormat("MM/dd/yyyy HH:mm:ss") } }; var result = JsonSerializer.Deserialize<List<YourClass>>(jsonString, options);
方式二:字段级特性标注
直接在date字段上绑定转换器:
public class YourClass { public int id { get; set; } public string name { get; set; } [JsonConverter(typeof(DateTimeConverterUsingDateFormat), "MM/dd/yyyy HH:mm:ss")] public DateTime date { get; set; } }
此时无需额外配置选项,直接调用反序列化即可。
注意事项
- 必须使用
CultureInfo.InvariantCulture,避免系统区域差异导致解析失败 - 若JSON字段名与C#属性名大小写不一致,System.Text.Json需开启
PropertyNameCaseInsensitive,Newtonsoft.Json默认支持大小写不匹配
内容的提问来源于stack exchange,提问作者SR_
相关产品推荐
相关产品推荐

