C#中如何解析JSON的/Date(...)格式DateTime字段并导出CSV?
解决旧ASP.NET日期格式的JSON解析问题
问题原因
你遇到的错误是因为JSON里的MeetingDate采用的是旧ASP.NET风格的日期格式(/Date(时间戳+时区偏移)/),而System.Text.Json默认不支持这种格式,无法直接转换为DateTime类型。
解决方案
下面提供两种可行的解决方法:
方法一:自定义Json转换器
创建一个针对这种日期格式的自定义转换器,让System.Text.Json能正确解析:
- 实现
JsonConverter<DateTime>:
public class AspNetDateTimeConverter : JsonConverter<DateTime> { private const string AspNetDateFormat = @"\/Date\((\d+)([+-]\d{4})?\)\/"; public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { string dateString = reader.GetString(); if (string.IsNullOrEmpty(dateString)) throw new JsonException("Invalid date string"); var match = Regex.Match(dateString, AspNetDateFormat); if (!match.Success) throw new JsonException("Unsupported date format"); // 解析时间戳(毫秒) long timestamp = long.Parse(match.Groups[1].Value); DateTime dateTime = DateTimeOffset.FromUnixTimeMilliseconds(timestamp).UtcDateTime; // 处理时区偏移(如果有) if (match.Groups[2].Success) { string offsetString = match.Groups[2].Value; TimeSpan offset = TimeSpan.ParseExact(offsetString, @"\+hhmm", CultureInfo.InvariantCulture); dateTime = dateTime.Add(offset); } return dateTime; } public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) { // 如果需要序列化回原格式可在此实现,默认输出ISO格式 writer.WriteStringValue(value.ToString("o")); } }
- 应用转换器:
- 方式A:直接在属性上标记特性
public class PFGetForm { public string Abbrev { get; set; } [JsonConverter(typeof(AspNetDateTimeConverter))] public DateTime MeetingDate { get; set; } }
- 方式B:反序列化时传入配置
var options = new JsonSerializerOptions(); options.Converters.Add(new AspNetDateTimeConverter()); var form = JsonSerializer.Deserialize<PFGetForm>(jsonString, options);
方法二:先以字符串接收,再手动转换
如果不想写转换器,可以先将MeetingDate定义为字符串,再手动解析为DateTime:
- 修改C#类:
public class PFGetForm { public string Abbrev { get; set; } public string MeetingDate { get; set; } }
- 解析并转换日期:
// 反序列化JSON var form = JsonSerializer.Deserialize<PFGetForm>(jsonString); // 提取时间戳并转换 long timestamp = long.Parse(Regex.Match(form.MeetingDate, @"\((\d+)").Groups[1].Value); DateTime meetingDate = DateTimeOffset.FromUnixTimeMilliseconds(timestamp).UtcDateTime; // 可选:处理时区偏移 var offsetMatch = Regex.Match(form.MeetingDate, @"([+-]\d{4})\)"); if (offsetMatch.Success) { TimeSpan offset = TimeSpan.ParseExact(offsetMatch.Groups[1].Value, @"\+hhmm", CultureInfo.InvariantCulture); meetingDate = meetingDate.Add(offset); } // 添加到列表 line.Add($"{meetingDate.ToString("dd/MM/yy")}");
后续导出CSV
完成日期解析后,即可正常将数据添加到列表,之后使用常规CSV导出方式(比如File.WriteAllLines逐行写入,或借助CsvHelper等工具库)完成导出。
内容的提问来源于stack exchange,提问作者saridd
相关产品推荐
相关产品推荐

