当前位置: 首页 > news >正文

在 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. 编写自定义转换器
using Newtonsoft.Json;
using System;public class UnixDateTimeConverter : JsonConverter<DateTime>
{// 反序列化时,将long类型的时间戳转换为DateTimepublic 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] 特性来指定我们定义的转换器:

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

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

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

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}"); // 打印结果}
}
输出示例:
输出 GetTime: 1/1/2023 12:00:00 AM

四、总结

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

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


http://www.mrgr.cn/news/52176.html

相关文章:

  • 无团队无资金,洗发水三月热销2600万?
  • 个人用Python复习笔记(待补充)
  • ESP32-C3实现定时器的启停(Arduino IDE)
  • C2. Adjust The Presentation (Hard Version)
  • 【ComfyUI Flux Lora】Flux 开启人物时尚摄影!拒绝胶质感!肤质表现更加细腻且真实!AWPortraitFL
  • 得物iOS函数调用栈及符号化调优实践|得物技术
  • Java中的基本循环结构详解
  • AcWing 861:二分图的最大匹配 ← 匈牙利算法
  • 单细胞分析Seurat使用相关的10个问题答疑精选!
  • 【Vue】项目部署本地部署和服务器部署
  • 机器学习摘下诺奖桂冠
  • javaWeb项目-Springboot+vue-校园论坛系统功能介绍
  • 华为OD机试真题---查找接口成功率最优时间段
  • css-(-webkit-、-moz-、-o-)前缀主要用于CSS和某些HTML属性,确保跨浏览器的兼容性和支持特定的CSS功能
  • 集成测试之我的初步学习与总结
  • 移动云智算平台,斩获两大国际知名设计奖项
  • STM32项目实战:基于STM32F4的智能灯光控制系统(LVGL),附项目教程/源码
  • 一文揭秘|预训练一个72b模型需要多久?
  • 进程间通信 —— 《共享内存》
  • 前端镜像源