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

C#中如何解析JSON的/Date(...)格式DateTime字段并导出CSV?

解决旧ASP.NET日期格式的JSON解析问题

问题原因

你遇到的错误是因为JSON里的MeetingDate采用的是旧ASP.NET风格的日期格式(/Date(时间戳+时区偏移)/),而System.Text.Json默认不支持这种格式,无法直接转换为DateTime类型。

解决方案

下面提供两种可行的解决方法:

方法一:自定义Json转换器

创建一个针对这种日期格式的自定义转换器,让System.Text.Json能正确解析:

  1. 实现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"));
    }
}
  1. 应用转换器:
  • 方式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:

  1. 修改C#类:
public class PFGetForm
{
    public string Abbrev { get; set; }        
    public string MeetingDate { get; set; }   
}
  1. 解析并转换日期:
// 反序列化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:08:10