在 C# 中通过 JsonConvert.DeserializeObject 将时间戳转换为 DateTime

在使用 C# 和 Newtonsoft.Json 库进行 JSON 反序列化时,可能会遇到这样一种情况:JSON 文件中的时间字段是一个 long 类型的 Unix 时间戳,但你希望在 C# 类中将其映射为 DateTime 类型。本文记录如何通过自定义 JsonConverter 来实现这一转换。


一、问题场景

假设你的 JSON 文件如下:

复制代码
{ "getTime": 1672531200 }

其中 getTime 是一个 Unix 时间戳(以秒为单位的整数),但是在 C# 中你想将其映射为 DateTime 类型。如果直接使用 JsonConvert.DeserializeObject 进行反序列化,会因为类型不匹配导致错误。因此,我们需要一种方式将时间戳转换为 DateTime。


二、解决方案:使用自定义 JsonConverter

通过继承 JsonConverter,我们可以自定义反序列化过程,将 long 类型的 Unix 时间戳正确转换为 DateTime。

1. 编写自定义转换器
cs 复制代码
using Newtonsoft.Json;
using System;

public class UnixDateTimeConverter : JsonConverter<DateTime>
{
    // 反序列化时,将long类型的时间戳转换为DateTime
    public override DateTime ReadJson(JsonReader reader, Type objectType, DateTime existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Integer)
        {
            var timestamp = (long)reader.Value;
            return DateTimeOffset.FromUnixTimeSeconds(timestamp).UtcDateTime; // 秒级时间戳转换为UTC时间
        }

        throw new JsonSerializationException("Unexpected token type when parsing date.");
    }

    // 序列化时,将DateTime转换为Unix时间戳
    public override void WriteJson(JsonWriter writer, DateTime value, JsonSerializer serializer)
    {
        var unixTimestamp = new DateTimeOffset(value).ToUnixTimeSeconds();
        writer.WriteValue(unixTimestamp);
    }
}
2. 在类中使用转换器

在需要反序列化时间戳的类上,为目标字段添加 [JsonConverter] 特性来指定我们定义的转换器:

cs 复制代码
using Newtonsoft.Json;
using System;

public class MyClass
{
    // 使用UnixDateTimeConverter将long时间戳转换为DateTime
    [JsonConverter(typeof(UnixDateTimeConverter))]
    public DateTime GetTime { get; set; }
}

三、示例代码:反序列化 JSON 数据

以下是完整的示例程序,将 JSON 中的时间戳转换为 DateTime:

cs 复制代码
using Newtonsoft.Json;
using System;

class Program
{
    static void Main()
    {
        string json = "{\"getTime\":1672531200}"; // JSON 数据中的时间戳
        
        MyClass myObject = JsonConvert.DeserializeObject<MyClass>(json); // 反序列化
        
        Console.WriteLine($"输出 GetTime: {myObject.GetTime}"); // 打印结果
    }
}
输出示例:
cs 复制代码
输出 GetTime: 1/1/2023 12:00:00 AM

四、总结

通过自定义 JsonConverter,我们可以轻松将 JSON 中的 long 类型 Unix 时间戳转换为 C# 的 DateTime 类型。这种方法不仅能处理时间戳的反序列化,还支持在序列化时将 DateTime 转换回 Unix 时间戳,从而保证了数据格式的灵活性。

这种方案非常适用于需要与外部系统交互、并且时间戳使用 Unix 标准的项目。通过此方式,可以在不更改 JSON 数据格式的情况下,使 C# 应用更方便地处理时间信息。

相关推荐
JavaGuide33 分钟前
DeepSeek Harness 重磅更新,Codex、Claude Code 子智能体进官方插件列表了,还有 Git 工作树和思考翻译!
前端·后端
小羊没烦恼!1 小时前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
Rain的Java大神之路1 小时前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
高频因子挖掘机1 小时前
A股分钟K线数据占内存:先缩小请求范围,还是换 DataFrame 工具?
后端·github·api
高级程序源1 小时前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
打工仔折腾 AI1 小时前
极空间用 Docker 部署 Photopea:网页版 PS 的私有化实践
运维·后端·python·docker·容器·langchain·ai agent 实战
掘金者阿豪2 小时前
别只会docker stats了:cAdvisor把CPU、内存、磁盘和网络监控搬进Web页面
后端
企业数字化笔记2 小时前
多租户系统从哪里开始设计?租户身份、数据隔离、权限与套餐的整体方案
java·spring boot·后端·junit
10年前端老司机2 小时前
一次业务迭代:聊聊知识库多版本可追溯审核流程怎么做
人工智能·后端·agent
Behavior2 小时前
Unity 7.0 Alpha 拆解:编辑器干掉 Mono 换 CoreCLR
c#·unity3d·游戏开发